Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Pourquoi le 5ème ID dans la clause IN modifie radicalement le plan de requête ?

Comme vous l'avez montré, MySQL a deux plans de requête alternatifs pour les requêtes avec ORDER BY ... LIMIT n :

  1. Lisez toutes les lignes éligibles, triez-les et sélectionnez les n rangées du haut.
  2. Lisez les lignes dans l'ordre trié et arrêtez-vous lorsque n des lignes de qualification ont été trouvées.

Afin de décider quelle est la meilleure option, l'optimiseur doit estimer l'effet de filtrage de votre condition WHERE. Ce n'est pas simple, en particulier pour les colonnes qui ne sont pas indexées ou pour les colonnes où les valeurs sont corrélées. Dans votre cas, il faut probablement lire beaucoup plus de la table dans l'ordre trié afin de trouver les 25 premières lignes de qualification que ce que l'optimiseur attendait.

Plusieurs améliorations ont été apportées à la gestion des requêtes LIMIT, à la fois dans les versions ultérieures de la version 5.6 (vous utilisez une version pré-GA !) et dans les versions plus récentes (5.7, 8.0). Je vous suggère d'essayer de mettre à niveau vers une version ultérieure et de voir si le problème persiste.

En général, si vous souhaitez comprendre les décisions du planificateur de requêtes, vous devez consulter la trace de l'optimiseur pour la requête.