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

MySQL com JOIN não usando índice


Não sei a diferença que você está vendo em suas instalações anteriores e atuais, mas o comportamento dos servidores faz sentido.
SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id )  ORDER BY  test_events.create_time DESC LIMIT 1; 

Nesta consulta, você não tem uma cláusula where, mas está buscando apenas uma linha. E isso depois de classificar por create_time que por acaso tem um índice. E esse índice pode ser usado para classificação. Mas vamos ver a segunda consulta.
SELECT  test_events.create_time  FROM  test_events  LEFT JOIN  test_event_types ON (  test_events.event =  test_event_types.id ) WHERE base = 314 ORDER BY  test_events.create_time DESC LIMIT 1

Você não tem um índice na coluna base. Portanto, nenhum índice pode ser usado nisso. Para encontrar os registros relevantes, o mysql tem que fazer uma varredura na tabela. Tendo identificado as linhas relevantes, elas precisam ser classificadas. Mas, neste caso, o planejador de consultas decidiu que não vale a pena usar o índice em create_time

Vejo vários problemas com sua configuração, sendo o primeiro não ter e indexar na base como já mencionado. Mas por que a base é varchar? Você parece estar armazenando números inteiros nele.
ALTER TABLE test_events
  ADD PRIMARY KEY (id),
  ADD KEY client (client),
  ADD KEY event_time (event_time),
  ADD KEY manager (manager),
  ADD KEY base_id (base_id),
  ADD KEY create_time (create_time);

E fazer vários índices como esse não faz muito sentido no mysql. Isso porque o mysql pode usar apenas um índice por tabela para consultas. Você estaria muito melhor com um ou dois índices. Possivelmente índices de várias colunas.

Acho que seu índice ideal conteria os campos create_time e event