Maison >base de données >tutoriel mysql >Pourquoi ma requête MySQL provoque-t-elle des tables temporaires et un tri de fichiers ?

Pourquoi ma requête MySQL provoque-t-elle des tables temporaires et un tri de fichiers ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-04 08:50:02596parcourir

Why Does My MySQL Query Cause Temporary Tables and Filesort?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn