Problèmes avec le tri temporaire et les fichiers dans MySQL : une analyse de schéma et de requête
Dans un système de suivi d'événements avec des tables de recherche et une table de journalisation, un problème survient avec une requête destinée à afficher les statistiques des objets par ordre décroissant d'importance. Bien que la requête fonctionne correctement avec un petit nombre d'entrées, ses résultats EXPLAIN suggèrent un potentiel d'optimisation.
La requête en question utilise une jointure gauche entre les tables event_log et lookup_event_objects, regroupant les résultats par object_id et triant par count_rows dans ordre décroissant, suivi de object_desc par ordre croissant. Cependant, cette requête génère des avertissements concernant l'utilisation d'une table temporaire et d'un tri de fichiers.
MySQL utilise des tables temporaires lorsque la requête contient une clause ORDER BY différente de la clause GROUP BY, ou lorsque le tri ou le regroupement est référencé à partir de tables autres que le premier de la jointure. Dans ce cas, le tri est basé sur un champ calculé, rendant impossible l'utilisation de l'index, d'où l'utilisation du tri de fichiers.
Pour résoudre le problème, supprimez la clause ORDER BY pour leo.object_desc. Cela éliminera le besoin de tables temporaires et de tri de fichiers, améliorant ainsi les performances des requêtes :
<code class="sql">EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC;</code>
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!