Maison  >  Article  >  base de données  >  Pourquoi ma requête MySQL utilise-t-elle « Utilisation de l'index ; Utilisation de temporaire ; Utilisation de Filesort » ?

Pourquoi ma requête MySQL utilise-t-elle « Utilisation de l'index ; Utilisation de temporaire ; Utilisation de Filesort » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 09:42:02774parcourir

Why is My MySQL Query Using

Utilisation d'index, utilisation de temporaire, utilisation de tri de fichiers : votre requête MySQL a-t-elle besoin d'être optimisée ?

Lors de la récupération de données à partir de tables de base de données, il est crucial de écrivez des requêtes efficaces qui minimisent le temps de traitement et la consommation de ressources. MySQL propose diverses techniques d'optimisation pour faciliter une exécution plus rapide des requêtes, mais parfois, les requêtes peuvent encore présenter un comportement sous-optimal. Dans ce cas, nous allons explorer une requête qui renvoie "Using index; Using Temporary; Using filesort" dans la sortie EXPLAIN.

Examinons la requête fournie :

    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,
            leo.object_desc ASC

Comprendre « Utilisation de temporaire »

La documentation MySQL indique qu'une table temporaire peut être créée en cas de divergence entre les clauses ORDER BY et GROUP BY, ou lorsque ORDER BY ou GROUP BY contient des colonnes de tables autre que la première table de la file d'attente de jointure. Dans cette requête, les deux conditions sont remplies. La clause ORDER BY trie par count_rows, qui est un champ calculé, et la clause GROUP BY regroupe par el.object_id à partir d'une table différente. D'où l'utilisation d'une table temporaire pour faciliter le processus de tri et de regroupement.

Comprendre "Utiliser Filesort"

Puisque le tri est effectué sur un champ calculé count_rows, un index ne peut pas être utilisé pour cette opération. Par conséquent, MySQL a recours à l'utilisation du tri de fichiers, qui consiste à lire les données du disque et à les trier en mémoire avant de renvoyer les résultats.

Optimiser la requête

Pour améliorer les performances de cette requête et éliminer l'utilisation de tables temporaires et de tri de fichiers, nous pouvons envisager de créer un index approprié, tel que :

CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));

Cet index permettra à MySQL de récupérer directement le nombre d'événements pour chaque object_id, éliminant la nécessité d'une table temporaire et d'un tri de fichiers.

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