Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que o índice é usado apenas quando forçado, mas não por padrão?


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