Maison  >  Article  >  base de données  >  Saviez-vous que MySQL Limit a des problèmes de performances ?

Saviez-vous que MySQL Limit a des problèmes de performances ?

步履不停
步履不停original
2019-06-19 14:51:352431parcourir

Saviez-vous que MySQL Limit a des problèmes de performances ?

La requête de pagination MySQL est généralement implémentée via limit.

L'utilisation de base limit de MySQL est très simple. limitReçoit 1 ou 2 paramètres entiers. S'il y a 2 paramètres, le premier spécifie le décalage de la première ligne d'enregistrement renvoyée, et le second spécifie le nombre maximum de lignes d'enregistrement renvoyées. Le décalage de la ligne d'enregistrement initiale est 0.

Pour la compatibilité avec PostgreSQL, limit prend également en charge limit # offset #.

Problème :

Pour les petits décalages, il n'y a aucun problème à utiliser directement limit pour interroger, mais à mesure que la quantité de données augmente, plus lors de la pagination, le le décalage de l'instruction limit sera plus grand et la vitesse sera nettement plus lente.

Idées d'optimisation :

Évitez d'analyser trop d'enregistrements lorsque la quantité de données est importante

Solution  :

méthode de pagination de sous-requête ou méthode de pagination JOIN.

L'efficacité de la pagination JOIN et de la pagination des sous-requêtes est fondamentalement au même niveau, et le temps consommé est fondamentalement le même.

Voici un exemple. Généralement, la clé primaire de MySQL est un type numérique à incrémentation automatique. Dans ce cas, la méthode suivante peut être utilisée pour l'optimisation.

Ce qui suit prend comme exemple une table avec 800 000 éléments de données dans un environnement de production réel pour comparer le temps de requête avant et après l'optimisation :

 -- 传统limit,文件扫描 [SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2; 受影响的行: 0 时间: 5.371s -- 子查询方式,索引扫描 [SQL] SELECT * FROM tableName WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1) LIMIT 2; 受影响的行: 0 时间: 0.274s -- JOIN分页方式 [SQL] SELECT * FROM tableName AS t1 JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2; 受影响的行: 0 时间: 0.278s

Vous pouvez voir que les performances se sont améliorées de près de 20% après les temps d'optimisation.

Principe d'optimisation :

La sous-requête est complétée sur l'index, tandis que la requête ordinaire est complétée sur le fichier de données. De manière générale, le fichier d'index est plus volumineux que les fichiers de données. sont beaucoup plus petits, donc les opérations seront plus efficaces. Parce que pour récupérer tout le contenu du champ, la première méthode doit couvrir un grand nombre de blocs de données et les récupérer, tandis que la deuxième méthode essentiellement directement localise en fonction du champ d'index avant de récupérer le contenu correspondant , donc le l'efficacité est naturellement grandement améliorée.

Par conséquent, l'optimisation de limit ne consiste pas à utiliser limit directement, mais à obtenir d'abord l'identifiant du décalage, puis à utiliser directement la taille limit pour obtenir les données.

Dans les projets réels, vous pouvez utiliser une méthode similaire au mode stratégie pour gérer la pagination. Par exemple, s'il y a 100 données par page, si elles se trouvent dans 100 pages, utilisez la méthode de pagination la plus basique. S'il est supérieur à 100, utilisez la méthode de pagination de sous-requête.

Pour plus d'articles techniques liés à MySQL, veuillez visiter la colonne Tutoriel MySQL pour apprendre !

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