Pourquoi MySQL utilise Temporary et Filesort dans cette requête
Votre requête pour extraire les statistiques d'objet des tables event_log et lookup_event_objects est confrontée à un goulot d'étranglement en termes de performances, comme indiqué par la sortie EXPLAIN "Utilisation de l'index ; Utilisation temporaire ; Utilisation du tri de fichiers." Voici pourquoi :
Tables temporaires
MySQL utilise des tables temporaires lorsqu'il y a une incompatibilité entre les clauses ORDER BY et GROUP BY, ou lorsque les colonnes de classement ou de regroupement appartiennent à des colonnes non -tables jointes. Dans ce cas, votre requête souffre de la première condition, car la clause ORDER BY (count_rows DESC, leo.object_desc ASC) diffère de la clause GROUP BY (el.object_id).
Filesort
"Utilisation du tri de fichiers" indique que MySQL n'est pas en mesure d'effectuer le tri spécifié dans la clause ORDER BY à l'aide d'un index. Puisque vous commandez par champ calculé (count_rows), la base de données doit effectuer une analyse complète de la table et trier les résultats.
Solution possible
Comme suggéré dans la réponse fournie, la solution consiste à supprimer la divergence entre les clauses ORDER BY et GROUP BY. Vous pouvez remplacer l'alias count_rows par l'opération de comptage réelle dans la clause GROUP BY :
SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id, count ORDER BY count DESC, leo.object_desc ASC;
Cela éliminera le besoin de tables temporaires et de tri de fichiers, améliorant potentiellement les performances de la requête.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!