Ralentissement des requêtes avec la clause ORDER BY
Les utilisateurs de bases de données MySQL ont rencontré un problème de performances déroutant lié à l'utilisation de la clause ORDER BY. Lorsqu'elle est ajoutée à une requête complexe comportant plusieurs jointures et sous-requêtes, le temps d'exécution de la requête augmente considérablement, passant de quelques millisecondes à quelques secondes.
Une instance spécifique implique une requête qui récupère les données de trois tables avec environ 40 000 lignes dans la plus grande table. Sans la clause ORDER BY, la requête s'exécute de manière optimale. Cependant, lorsqu'une colonne est utilisée comme critère de tri, la requête ralentit de plusieurs ordres de grandeur jusqu'à environ 10 secondes.
La cause première de ce problème réside dans le mécanisme d'optimisation de la base de données. Par défaut, MySQL tente d'optimiser les requêtes en créant des tables temporaires ou en utilisant des sous-requêtes. Lorsqu'une clause ORDER BY est ajoutée, l'optimiseur calcule mal la taille de la table temporaire nécessaire et alloue une quantité de mémoire insuffisante. Par conséquent, la requête retombe sur un algorithme de tri moins efficace, ce qui entraîne le ralentissement observé.
Une solution de contournement possible consiste à réécrire la requête à l'aide d'une sous-requête corrélée ou d'un CTE (Common Table Expression) pour spécifier explicitement le étape de tri. Cela permet à l'optimiseur d'estimer correctement la taille de la table temporaire, évitant ainsi le ralentissement.
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!