para um melhor desempenho, você pode tentar usar o índice composto .. com base na coluna envolvida em sua cláusula where
e tente alterar a cláusula IN em uma junção interna
assumindo que o conteúdo da sua cláusula IN é um conjunto de valores fixos você pode usar union (ou uma nova tabela com o valor que você precisa)
por exemplo, usando a união (você pode fazer algo semelhante se a cláusula IN for uma subconsulta)
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;
você também pode adicionar um índice composto na tabela user_table nas colunas
colA, colB, colC
para o que está relacionado ao elemento usado pelo otimizador de consulta mysql para decidir o índice a usar há vários aspectos e para todos eles o otimizador de consulta atribui um custo
qualquer que você deve levar em consideração
- a coluna envolvida na cláusula Where
- O tamanho das tabelas (e não necessariamente o tamanho das tabelas na junção)
- Uma estimativa de quantas linhas serão buscadas (para decidir se deve usar um índice ou simplesmente varrer a tabela)
- se os tipos de dados correspondem ou não entre as colunas na cláusula jion e where
- O uso de conversão de função ou tipo de dados, incluindo incompatibilidade de agrupamento
- O tamanho do índice
- cardinalidade do índice
e para todas essas opções é avaliado um custo e isso leva a escolha do índice
No seu caso o colC as date pode implicar em uma conversão de dados (respeite os valores literais como string ) e para isso o índice não é escolhido ..
É também para isso que sugeri um índice composto com a coluna mais à esquerda relacionada a valores não convertidos