Maison base de données tutoriel mysql Comment optimiser la requête de pagination MySQL

Comment optimiser la requête de pagination MySQL

Jun 20, 2022 pm 01:09 PM
mysql

Méthodes d'optimisation pour les requêtes de pagination : 1. L'optimisation des sous-requêtes et l'amélioration des performances peuvent être obtenues en réécrivant les instructions SQL de pagination en sous-requêtes. 2. Optimisation de la limitation des identifiants, vous pouvez calculer la plage des identifiants interrogés en fonction du nombre de pages interrogées et du nombre d'enregistrements interrogés, puis interroger en fonction de l'instruction « id entre et ». 3. Optimisez en fonction de la réorganisation de l'index, recherchez les adresses de données pertinentes via l'index et évitez les analyses de table complètes. 4. Pour une optimisation d'association retardée, vous pouvez utiliser JOIN pour terminer d'abord l'opération de pagination sur la colonne d'index, puis revenir à la table pour obtenir les colonnes requises.

Comment optimiser la requête de pagination MySQL

L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.

L'efficacité des requêtes de pagination est particulièrement importante lorsque la quantité de données est importante, affectant la réponse frontale et l'expérience utilisateur.

Méthode d'optimisation de la requête de pagination

1. Utilisez l'optimisation de sous-requête

Cette méthode localise d'abord l'identifiant à la position de décalage, puis interroge vers l'arrière. Cette méthode convient au cas où l'identifiant est. croissant.

Principe d'optimisation des sous-requêtes : https://www.jianshu.com/p/0768ebc4e28d

select * from sbtest1 where k=504878 limit 100000,5;Processus de requête :

Tout d'abord, les données du nœud feuille d'index seront interrogées, puis regroupées en fonction de la valeur de clé primaire sur la feuille node Toutes les valeurs de champ requises pour l'interrogation sur l'index. Comme le montre le côté gauche de la figure ci-dessous, vous devez interroger le nœud d'index 100 005 fois, interroger les données d'index clusterisé 100 005 fois, et enfin filtrer les résultats des 100 000 premiers éléments et supprimer les 5 derniers éléments. MySQL dépense beaucoup d'E/S aléatoires pour interroger des données dans l'index clusterisé, et les données interrogées par 100 000 E/S aléatoires n'apparaîtront pas dans l'ensemble de résultats.

Comment optimiser la requête de pagination MySQL

Puisque l'index est utilisé au début, pourquoi ne pas d'abord interroger les nœuds feuilles de l'index jusqu'aux 5 derniers nœuds nécessaires, puis interroger les données réelles dans l'index clusterisé. Cela ne nécessite que 5 E/S aléatoires, similaire au processus sur le côté droit de l'image ci-dessus. Il s'agit d'une optimisation de sous-requête. Cette méthode localise d'abord l'identifiant à la position de décalage, puis interroge plus tard. Cette méthode convient aux situations où l'identifiant augmente. Comme indiqué ci-dessous :

mysql> select *  from sbtest1 where k=5020952 limit 50,1;
mysql> select id  from sbtest1 where k=5020952 limit 50,1;
mysql> select * from sbtest1 where k=5020952 and id>=( select id  from sbtest1 where k=5020952 limit 50,1) limit 10;
mysql> select * from sbtest1 where k=5020952 limit 50,10;

Dans l'optimisation des sous-requêtes, le fait que k dans le prédicat ait un index a un grand impact sur l'efficacité de la requête. L'instruction ci-dessus n'utilise pas l'index et une analyse complète de la table prend 24,2 secondes, mais après avoir utilisé l'index. , cela ne prend que 0,67 seconde.

mysql> explain  select * from sbtest1 where k=5020952 and id>=( select id  from sbtest1 where k=5020952 limit 50,1) limit 10;
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
| id | select_type | table   | partitions | type        | possible_keys | key        | key_len | ref   | rows | filtered | Extra                                    |
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
|  1 | PRIMARY     | sbtest1 | NULL       | index_merge | PRIMARY,c1    | c1,PRIMARY | 8,4     | NULL  |   19 |   100.00 | Using intersect(c1,PRIMARY); Using where |
|  2 | SUBQUERY    | sbtest1 | NULL       | ref         | c1            | c1         | 4       | const |   88 |   100.00 | Using index                              |
+----+-------------+---------+------------+-------------+---------------+------------+---------+-------+------+----------+------------------------------------------+
2 rows in set, 1 warning (0.11 sec)

Mais cette méthode d'optimisation a aussi des limites :

  • Cette façon d'écrire nécessite que l'ID de clé primaire soit continu

  • La clause Where ne permet pas d'ajouter d'autres conditions

2. Optimisation de la qualification

Cette méthode suppose que l'identifiant de la table de données augmente continuellement. Nous pouvons ensuite calculer la plage de l'identifiant interrogé en fonction du nombre de pages interrogées et du nombre d'enregistrements interrogés. Vous pouvez utiliser l'identifiant entre et vers. requête.

En supposant que l'identifiant de la table dans la base de données augmente continuellement, la plage de l'identifiant interrogé peut être calculée en fonction du nombre de pages interrogées et du nombre d'enregistrements interrogés, puis interrogée en fonction de l'identifiant entre et de l'instruction. La plage d'identifiant peut être calculée via la formule de pagination. Par exemple, si la taille de la page actuelle est m et le numéro de page actuel est no1, alors la valeur maximale de la page est max=(no1+1)m-1, et la valeur minimale est min=no1m. Les instructions SQL peuvent être exprimées sous la forme d'un identifiant compris entre min et max.

select * from sbtest1 where id between 1000000 and 1000100 limit 100;

Cette méthode de requête peut considérablement optimiser la vitesse de requête et peut essentiellement être complétée en quelques dizaines de millisecondes. La limitation est que vous devez connaître clairement l'identifiant, mais généralement dans la table métier de la requête de pagination, le champ id de base sera ajouté, ce qui apporte beaucoup de commodité à la requête de pagination. Il existe une autre façon d'écrire le SQL ci-dessus :

select * from sbtest1 where id >= 1000001 limit 100;

Vous pouvez voir la différence de temps d'exécution :

mysql> show profiles;
+----------+------------+--------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                        |
+----------+------------+--------------------------------------------------------------------------------------------------------------+
|        6 | 0.00085500 | select * from sbtest1 where id between 1000000 and 1000100 limit 100                                         |
|        7 | 0.12927975 | select * from sbtest1 where id >= 1000001 limit 100                                                          |
+----------+------------+--------------------------------------------------------------------------------------------------------------+

Vous pouvez également utiliser la méthode in pour interroger. Cette méthode est souvent utilisée pour interroger lorsque plusieurs tables sont associées. ID de requête de table défini sur query :

select * from sbtest1 where id in (select id from sbtest2 where k=504878) limit 100;

Lors de l'utilisation d'une requête in, veuillez noter que certaines versions de MySQL ne prennent pas en charge l'utilisation de limit dans la clause in.

3. Optimisation basée sur la réorganisation de l'index

La réorganisation basée sur l'index utilise l'algorithme d'optimisation dans la requête d'index pour trouver l'adresse de données pertinente via l'index afin d'éviter une analyse complète de la table, ce qui permet de gagner beaucoup de temps. De plus, Mysql dispose également d'un cache d'index associé, et il sera préférable d'utiliser le cache lorsque la concurrence est élevée. Vous pouvez utiliser l'instruction suivante dans MySQL :

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M

Cette méthode convient aux situations où la quantité de données est importante (des dizaines de milliers de tuples). Il est préférable que l'objet colonne après ORDER BY soit la clé primaire ou l'index unique. , de sorte que l'opération ORDER BY puisse utiliser l'index est éliminée mais le jeu de résultats est stable. Par exemple, les deux instructions suivantes :

mysql> show profiles;
+----------+------------+--------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                        |
+----------+------------+--------------------------------------------------------------------------------------------------------------+
|        8 | 3.30585150 | select * from sbtest1 limit 1000000,10                                                                       |
|        9 | 1.03224725 | select * from sbtest1 order by id limit 1000000,10                                                           |
+----------+------------+--------------------------------------------------------------------------------------------------------------+

Après avoir utilisé l'instruction order by pour l'identifiant du champ d'index, les performances ont été considérablement améliorées.

4. Utilisez l'association retardée pour optimiser

Semblable à la méthode de sous-requête ci-dessus, nous pouvons utiliser JOIN pour terminer d'abord l'opération de pagination sur la colonne d'index, puis revenir à la table pour obtenir les colonnes requises.

select a.* from t5 a inner join (select id from t5 order by text limit 1000000, 10) b on a.id=b.id;

Comment optimiser la requête de pagination MySQL

从实验中可以得出,在采用JOIN改写后,上面的两个局限性都已经解除了,而且SQL的执行效率也没有损失。

5、记录上次查询结束的位置

和上面使用的方法都不同,记录上次结束位置优化思路是使用某种变量记录上一次数据的位置,下次分页时直接从这个变量的位置开始扫描,从而避免MySQL扫描大量的数据再抛弃的操作。

select * from t5 where id>=1000000 limit 10;

Comment optimiser la requête de pagination MySQL

6、使用临时表优化

使用临时存储的表来记录分页的id然后进行in查询

这种方式已经不属于查询优化,这儿附带提一下。

对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。

【相关推荐:mysql视频教程

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 de ce site Web
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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Guide de construction d'Agnes Tachyon | Un joli Musume Derby
2 Il y a quelques semaines By Jack chen
Oguri Cap Build Guide | Un joli Musume Derby
3 Il y a quelques semaines By Jack chen
Péx: comment raviver les joueurs
4 Il y a quelques semaines By DDD
Guide de construction de Grass Wonder | Uma musume joli derby
1 Il y a quelques semaines By Jack chen
Pic comment émoter
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Effectuer des sauvegardes logiques à l'aide de mysqldump dans MySQL Effectuer des sauvegardes logiques à l'aide de mysqldump dans MySQL Jul 06, 2025 am 02:55 AM

MySQLDump est un outil commun pour effectuer des sauvegardes logiques des bases de données MySQL. Il génère des fichiers SQL contenant des instructions de création et d'insertion pour reconstruire la base de données. 1. Il ne sauvegarde pas le fichier d'origine, mais convertit la structure de la base de données et le contenu en commandes SQL portables; 2. Il convient aux petites bases de données ou à la récupération sélective et ne convient pas à la récupération rapide des données de niveau TB; 3. 4. Utilisez la commande MySQL pour importer pendant la récupération et peut désactiver les vérifications des clés étrangères pour améliorer la vitesse; 5. Il est recommandé de tester régulièrement la sauvegarde, d'utiliser la compression et de régler automatiquement.

Implémentation de transactions et compréhension des propriétés acides dans MySQL Implémentation de transactions et compréhension des propriétés acides dans MySQL Jul 08, 2025 am 02:50 AM

MySQL prend en charge le traitement des transactions et utilise le moteur de stockage InNODB pour garantir la cohérence et l'intégrité des données. 1. Les transactions sont un ensemble d'opérations SQL, soit tous réussissent ou ne parviennent pas à reculer; 2. Les attributs acides comprennent l'atomicité, la cohérence, l'isolement et la persistance; 3. Les déclarations qui contrôlent manuellement les transactions sont StartTransaction, Commit and Rollback; 4. Les quatre niveaux d'isolement incluent la lecture non engagée, la lecture soumise, la lecture reproductible et la sérialisation; 5. Utilisez correctement les transactions pour éviter le fonctionnement à long terme, désactiver les validations automatiques et gérer raisonnablement les verrous et les exceptions. Grâce à ces mécanismes, MySQL peut obtenir une forte fiabilité et un contrôle simultané.

Configuration de la réplication asynchrone primaire-replica dans MySQL Configuration de la réplication asynchrone primaire-replica dans MySQL Jul 06, 2025 am 02:52 AM

Pour configurer la réplication maître-esclave asynchrone pour MySQL, suivez ces étapes: 1. Préparez le serveur maître, activez les journaux binaires et définissez un serveur unique, créez un utilisateur de réplication et enregistrez l'emplacement du journal actuel; 2. Utilisez MySQLDump pour sauvegarder les données de la bibliothèque maître et l'importez-les au serveur esclave; 3. Configurez le serveur-ID et le log-log du serveur esclave, utilisez la commande Changemaster pour vous connecter à la bibliothèque maître et démarrer le thread de réplication; 4. Vérifiez les problèmes communs, tels que le réseau, les autorisations, la cohérence des données et les conflits d'auto-augmentation, et surveiller les retards de réplication. Suivez les étapes ci-dessus pour vous assurer que la configuration est terminée correctement.

Gestion des ensembles de personnages et des problèmes de collations dans MySQL Gestion des ensembles de personnages et des problèmes de collations dans MySQL Jul 08, 2025 am 02:51 AM

Les problèmes de règles de jeu de caractères et de tri sont courants lors de la migration multiplateforme ou du développement multi-personnes, entraînant un code brouillé ou une requête incohérente. Il existe trois solutions principales: d'abord, vérifiez et unifiez le jeu de caractères de la base de données, de la table et des champs vers UTF8MB4, affichez via ShowCreateDatabase / Table, et modifiez-le avec une instruction alter; Deuxièmement, spécifiez le jeu de caractères UTF8MB4 lorsque le client se connecte et le définissez dans les paramètres de connexion ou exécutez SetNames; Troisièmement, sélectionnez les règles de tri raisonnablement et recommandez d'utiliser UTF8MB4_UNICODE_CI pour assurer la précision de la comparaison et du tri, et spécifiez ou modifiez-la via ALTER lors de la construction de la bibliothèque et du tableau.

Connexion à la base de données MySQL à l'aide du client de ligne de commande Connexion à la base de données MySQL à l'aide du client de ligne de commande Jul 07, 2025 am 01:50 AM

La façon la plus directe de se connecter à la base de données MySQL consiste à utiliser le client de la ligne de commande. Entrez d'abord le nom d'utilisateur MySQL-U -P et entrez correctement le mot de passe pour entrer l'interface interactive; Si vous vous connectez à la base de données distante, vous devez ajouter le paramètre -H pour spécifier l'adresse hôte. Deuxièmement, vous pouvez directement passer à une base de données spécifique ou exécuter des fichiers SQL lors de la connexion, tels que le nom de la base de données MySQL-U Username-P ou le nom de la base de données MySQL-U Username-P-P

Gérer les jeux de caractères et les collations dans MySQL Gérer les jeux de caractères et les collations dans MySQL Jul 07, 2025 am 01:41 AM

Le réglage des jeux de caractères et des règles de collation dans MySQL est crucial, affectant le stockage des données, l'efficacité de la requête et la cohérence. Premièrement, le jeu de caractères détermine la gamme de caractères storable, telle que UTF8MB4 prend en charge les chinois et les emojis; Les règles de tri contrôlent la méthode de comparaison des caractères, telle que UTF8MB4_UNICODE_CI est sensible à la casse, et UTF8MB4_BIN est une comparaison binaire. Deuxièmement, le jeu de caractères peut être défini à plusieurs niveaux de serveur, de base de données, de table et de colonne. Il est recommandé d'utiliser UTF8MB4 et UTF8MB4_UNICODE_CI de manière unifiée pour éviter les conflits. En outre, le problème du code brouillé est souvent causé par des jeux de caractères incohérents de connexions, de stockage ou de terminaux de programme, et doit être vérifié par calque par calque et définir uniformément. De plus, les ensembles de caractères doivent être spécifiés lors de l'exportation et de l'importation pour éviter les erreurs de conversion

Concevoir une stratégie de sauvegarde de la base de données MySQL robuste Concevoir une stratégie de sauvegarde de la base de données MySQL robuste Jul 08, 2025 am 02:45 AM

Pour concevoir une solution de sauvegarde MySQL fiable, 1. Premièrement, clarifiez les indicateurs RTO et RPO, et déterminez la fréquence et la méthode de sauvegarde en fonction de la plage de temps d'arrêt et de perte de données acceptable de l'entreprise; 2. Adoptez une stratégie de sauvegarde hybride, combinant une sauvegarde logique (comme MySQLDump), une sauvegarde physique (telle que Perconaxtrabackup) et un journal binaire (binlog), pour obtenir une récupération rapide et une perte de données minimale; 3. Testez régulièrement le processus de récupération pour assurer l'efficacité de la sauvegarde et familiariser avec les opérations de récupération; 4. Faites attention à la sécurité du stockage, y compris le stockage hors site, la protection du chiffrement, la politique de rétention de version et la surveillance des tâches de sauvegarde.

En utilisant des expressions de table communes (CTES) dans MySQL 8 En utilisant des expressions de table communes (CTES) dans MySQL 8 Jul 12, 2025 am 02:23 AM

Les CTES sont une fonctionnalité introduite par MySQL8.0 pour améliorer la lisibilité et la maintenance des requêtes complexes. 1. CTE est un ensemble de résultats temporaire, qui n'est valable que dans la requête actuelle, a une structure claire et prend en charge les références en double; 2. Comparé aux sous-requêtes, le CTE est plus lisible, réutilisable et prend en charge la récursivité; 3. Le CTE récursif peut traiter les données hiérarchiques, telles que la structure organisationnelle, qui doit inclure des requêtes initiales et des pièces de récursivité; 4. Les suggestions d'utilisation incluent l'évitement de l'abus, la dénomination des spécifications, la prête d'attention aux performances et aux méthodes de débogage.

See all articles