per prestazioni migliori potresti provare a utilizzare l'indice composito .. in base alla colonna coinvolta nella tua clausola where
e provare a modificare la clausola IN in un inner join
supponendo che il contenuto della tua clausola IN sia un insieme di valori fissi potresti usare union (o una nuova tabella con il valore che ti serve)
es. usando l'unione (puoi fare qualcosa di simile se la clausola IN è una sottoquery)
select user_table.colA ,ColB , count(*) as count
from user_table
INNER JOIN (
select 'FIXED1' colA
union
select 'FIXED2'
....
union
select 'FIXEDX'
) t on t.colA = user_table.colA
where colC >='2019-09-01 00:00:00'
and ColB = 17
group by colA ,ColB;
potresti anche aggiungere un indice composito sulla tabella user_table sulle colonne
colA, colB, colC
per quanto riguarda l'elemento utilizzato da mysql Query Optimizer per decidere l'indice da utilizzare in vari aspetti e per tutti questi Query Optimizer assegna un costo
qualsiasi cosa dovresti prendere in considerazione
- la colonna coinvolta nella clausola Where
- La dimensione delle tabelle (e non la dimensione delle tabelle in join)
- Una stima di quante righe verranno recuperate (per decidere se utilizzare un indice o semplicemente scansionare la tabella)
- se i tipi di dati corrispondono o meno tra le colonne nella clausola jion e where
- L'uso della funzione o della conversione del tipo di dati, inclusa la mancata corrispondenza delle regole di confronto
- La dimensione dell'indice
- cardinalità dell'indice
e per tutte queste opzioni viene valutato un costo e questo porta all'indice scegli
Nel tuo caso il colC come data potrebbe implicare una conversione dei dati (rispetta i valori letterali come string ) e per questo l'indice non è scelto..
È anche per questo che ho suggerito un indice composito con la colonna più a sinistra relativa ai valori non convertiti