Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL est-elle lente avec ORDER BY et comment puis-je y remédier ?

Pourquoi ma requête SQL est-elle lente avec ORDER BY et comment puis-je y remédier ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-04 04:20:11491parcourir

Why is my SQL query slow with ORDER BY, and how can I fix it?

Performances lentes lors de l'utilisation de ORDER BY dans une requête complexe

Dans une requête complexe avec plusieurs jointures et sous-requêtes, l'ajout d'une clause ORDER BY peut conduire à des temps d’exécution considérablement plus lents. Ce problème a été signalé dans une requête contenant quatre tables et renvoyant seulement 13 lignes. La requête s'exécute rapidement sans la clause ORDER BY mais devient lente lorsqu'elle est ajoutée.

Solution

Pour résoudre ce problème de performances, il est recommandé d'envelopper la requête dans une sous-requête et appliquez la clause ORDER BY à la requête externe. Voici la requête modifiée :

SELECT *
FROM (
    SELECT
    Course.CourseID,
    Course.Description,
    UserCourse.UserID,
    UserCourse.TimeAllowed,
    UserCourse.CreatedOn,
    UserCourse.PassedOn,
    UserCourse.IssuedOn,
    C.LessonCnt
    FROM
    UserCourse
    INNER JOIN
    Course
    USING(CourseID)
    INNER JOIN
    (
        SELECT CourseID, COUNT(*) AS LessonCnt FROM CourseSection GROUP BY CourseID
    ) C
    USING(CourseID)
    WHERE 
    UserCourse.UserID = 8810
)
ORDER BY CourseID;

Explication

La raison pour laquelle cette solution fonctionne est qu'elle permet à l'optimiseur d'évaluer la sous-requête indépendamment de l'opération ORDER BY. Il en résulte un plan d'exécution plus efficace qui n'est pas affecté par la lente opération ORDER BY.

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