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

Pourquoi MySQL est-il lent lorsque j'utilise LIMIT dans ma requête ?

Les index n'améliorent pas nécessairement les performances. Pour mieux comprendre ce qui se passe, il serait utile d'inclure le explain pour les différentes requêtes.

Ma meilleure supposition serait que vous avez un index dans id_state ou même id_state, id_mp qui peut être utilisé pour satisfaire le where clause. Si oui, la première requête sans le order by utiliserait cet indice. Cela devrait être assez rapide. Même sans index, cela nécessite un balayage séquentiel des pages dans les orders table, qui peut encore être assez rapide.

Ensuite, lorsque vous ajoutez l'index le creation_date , MySQL décide d'utiliser cet index à la place pour le order by . Cela nécessite de lire chaque ligne de l'index, puis de récupérer la page de données correspondante pour vérifier where conditions et renvoie les colonnes (s'il y a une correspondance). Cette lecture est très inefficace, car elle n'est pas dans l'ordre des "pages" mais plutôt comme spécifié par l'index. Les lectures aléatoires peuvent être assez inefficaces.

Pire, même si vous avez une limit , vous devez encore lire l'intégralité table car le jeu de résultats complet est nécessaire. Bien que vous ayez enregistré un tri sur 38 enregistrements, vous avez créé une requête massivement inefficace.

Soit dit en passant, cette situation s'aggrave considérablement si les orders la table ne tient pas dans la mémoire disponible. Ensuite, vous avez une condition appelée "thrashing", où chaque nouvel enregistrement a tendance à générer une nouvelle lecture d'E/S. Ainsi, si une page contient 100 enregistrements, la page peut devoir être lue 100 fois.

Vous pouvez accélérer l'exécution de toutes ces requêtes en ayant un index sur orders(id_state, id_mp, creation_date) . Le where la clause utilisera les deux premières colonnes et le order by utilisera le dernier.