L'instruction MySQL s'exécute lentement avec un grand ensemble de données
Lorsque vous travaillez avec de grandes bases de données, le temps d'exécution des requêtes peut devenir un problème. Cet article traite d'un scénario spécifique dans lequel une requête sur une table contenant plus d'un million d'enregistrements prend plus d'une minute à s'exécuter.
Le problème
La requête suivante prenait le relais une minute à exécuter, même avec une colonne "id" indexée :
SELECT * FROM `ratings` ORDER BY id LIMIT 499500, 500;
La table contenait environ un million d'enregistrements, et la requête impliquait un classement par colonne "id" et limiter les résultats à une plage spécifique.
Analyse et solution
Après avoir étudié la structure de la requête et de la table, il a été déterminé que le temps d'exécution lent était dû à l'utilisation d'une opération de "tri de fichiers". Cela se produit lorsque MySQL ne trouve pas d'index approprié à utiliser pour la clause ORDER BY et doit trier les lignes du tableau en mémoire.
Pour résoudre ce problème, il a été recommandé d'utiliser une clause WHERE plus sélective au lieu de la clause WHERE. Clause ORDER BY. Dans ce cas, la requête suivante s'est exécutée beaucoup plus rapidement :
SELECT * FROM `ratings` WHERE id >= 499501 LIMIT 500;
Cette requête a utilisé la colonne indexée "id" pour affiner les lignes à trier, réduisant ainsi considérablement le temps nécessaire à l'exécution de la requête.
Considérations supplémentaires
Il est important de noter que l'utilisation d'une clause WHERE au lieu d'une clause ORDER BY n'est pas toujours possible ou pratique. Dans de tels cas, d'autres optimisations telles que la création d'index supplémentaires ou l'optimisation de la structure de la base de données peuvent être nécessaires. De plus, les blocages potentiels doivent également être exclus comme cause possible de ralentissement des performances.
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!