Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL avec JOIN n'utilisant pas l'index

Je ne connais pas la différence que vous voyez dans vos installations précédentes et actuelles, mais le comportement des serveurs est logique.

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; 

Dans cette requête, vous n'avez pas de clause where mais vous ne récupérez qu'une seule ligne. Et c'est après le tri par create_time qui se trouve avoir un index. Et cet index peut être utilisé pour le tri. Mais voyons la seconde requête.

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

Vous n'avez pas d'index sur la colonne de base. Donc, aucun index ne peut être utilisé à ce sujet. Pour trouver les enregistrements pertinents, mysql doit effectuer une analyse de la table. Après avoir identifié les lignes pertinentes, elles doivent être triées. Mais dans ce cas, le planificateur de requêtes a décidé que cela ne valait tout simplement pas la peine d'utiliser l'index sur create_time

Je vois plusieurs problèmes avec votre configuration, le premier étant de ne pas avoir et d'indexer sur base comme déjà mentionné. Mais pourquoi base varchar ? Vous semblez y stocker des nombres entiers.

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);

Et créer plusieurs index comme celui-ci n'a pas beaucoup de sens dans mysql. C'est parce que mysql ne peut utiliser qu'un seul index par table pour les requêtes. Vous seriez bien mieux avec un ou deux index. Peut-être des index multi-colonnes.

Je pense que votre index idéal contiendrait à la fois les champs create_time et event