Maison >base de données >tutoriel mysql >Comment optimiser le temps d'exécution des requêtes MySQL pour les grands ensembles de données ?

Comment optimiser le temps d'exécution des requêtes MySQL pour les grands ensembles de données ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-26 01:38:11826parcourir

How to Optimize MySQL Query Execution Time for Large Datasets?

Optimisation du temps d'exécution des requêtes MySQL

Lorsque vous travaillez avec de grandes bases de données, le temps d'exécution des requêtes devient un facteur crucial. Dans l’un de ces scénarios, une base de données de site Web contenant 1 million d’enregistrements rencontrait des temps d’exécution excessifs pour les requêtes. Un exemple de requête, présenté ci-dessous, a démontré ce problème :

select * from `ratings` order by id limit 499500, 500

Malgré l'opinion selon laquelle la gestion d'un million d'enregistrements dans les tables MySQL ne devrait pas poser de problèmes, l'exécution de cette requête prenait systématiquement plus d'une minute. L'ajout d'un index sur la colonne id n'a pas réussi à atténuer ce problème.

Cependant, après examen du plan EXPLAIN pour cette requête, il a été découvert que la requête utilisait une approche d'analyse de table complète :

explain select * from `ratings` order by id limit 499500, 500;
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows    | Extra          |
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
|  1 | SIMPLE      | ratings | ALL  | NULL          | NULL | NULL    | NULL | 4718592 | Using filesort |
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+

Pour résoudre ce problème, il a été suggéré d'utiliser une clause Where pour affiner les critères de recherche. Lorsqu'une clause Where a été ajoutée, le plan de requête a changé :

explain select * from `ratings` where id>=499501 limit 500;
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+
| id | select_type | table   | type  | possible_keys | key     | key_len | ref  | rows    | Extra                 |
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+
|  1 | SIMPLE      | ratings | range | PRIMARY       | PRIMARY | 4       | NULL | 4198581 | Using index condition |
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+

Ce changement a conduit la requête à utiliser une approche de condition d'indexation, améliorant considérablement son temps d'exécution.

De plus, la possibilité de un blocage dans le processus d'exécution des requêtes ne peut être exclu. Pour diagnostiquer les blocages, la commande SHOW INNODB STATUS peut être utile.

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