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!