Maison base de données tutoriel mysql Méthode de requête de pagination MySQL pour des millions de données et ses suggestions d'optimisation

Méthode de requête de pagination MySQL pour des millions de données et ses suggestions d'optimisation

May 07, 2021 pm 03:09 PM
mysql 分页查询

Méthode de requête de pagination MySQL pour des millions de données et ses suggestions doptimisation

L'optimisation SQL des bases de données est un problème courant Face à des requêtes de pagination contenant des millions de volumes de données, quelles sont les bonnes suggestions d'optimisation ? Certaines méthodes couramment utilisées sont répertoriées ci-dessous pour votre référence et votre apprentissage !

Méthode 1 : Utiliser directement l'instruction SQL fournie par la base de données

  • Style d'instruction : Dans MySQL, ce qui suit Des méthodes sont disponibles : select C'est très lent et certains jeux de résultats de base de données renvoient un résultat instable (par exemple, une fois renvoie 1, 2, 3 et une autre fois renvoie 2, 1, 3). La limite restreint N sorties à partir de la position M de la). ensemble de résultats et le reste Abandonner.

  • Méthode 2 : Créer une clé primaire ou un index unique et utiliser l'index (en supposant 10 éléments par page)

Style de déclaration : dans MySQL, les méthodes suivantes peuvent être utilisées : SELECT * FROM table name WHERE id_pk > (pageNum*10) LIMIT M 10,000)

Raison : L'analyse de l'index sera très rapide. Un ami a suggéré : Comme la requête de données n'est pas triée selon pk_id, il y aura des cas de données manquantes, donc seule la méthode 3
  • Méthode 3 : Réorganiser en fonction de l'index

Style d'instruction : Dans MySQL, la méthode suivante est disponible : SELECT * FROM table Name WHERE id_pk > ) ORDER BY id_pk ASC LIMIT MScénario adaptatif : convient aux situations avec de grandes quantités de données (des dizaines de milliers de tuples). Il est préférable que l'objet colonne après ORDER BY soit la clé primaire ou la seule raison. pourquoi l'opération ORDERBY peut être éliminée à l'aide de l'index mais l'ensemble de résultats est stable (pour la signification de la stabilité, voir méthode 1)

Raison : l'analyse de l'index sera très rapide mais l'opération de tri de MySQL uniquement ASC ne le fait pas. avoir DESC (DESC est faux, du vrai DESC sera créé dans le futur, j'attends avec impatience...).
  • Méthode 4 : Utiliser préparer
    basé sur l'index

Le premier point d'interrogation signifie pageNum, le second ? Indique le nombre de tuples par page Style d'instruction : Dans MySQL, la méthode suivante peut être utilisée : PREPARE stmt_name FROM SELECT * FROM table name WHERE id_pk > LIMIT M

Convient aux scénarios : volume de données important

Raison : l'analyse de l'index sera très rapide. L'instruction de préparation est plus rapide que l'instruction de requête générale.
  • Méthode 5 : en utilisant MySQL pour prendre en charge les opérations ORDER, vous pouvez utiliser des index pour localiser rapidement certains tuples et éviter les analyses de table complètes

Par exemple : lire les tuples dans les lignes 1000 à 1019 (pk est la clé primaire/clé unique).

SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20
Copier après la connexion
Méthode 6 : utiliser la sous-requête/join + index pour localiser rapidement la position du tuple, puis lisez le tuple.

Par exemple (l'identifiant est la clé primaire/clé unique, variable de temps de police bleue)Exemple d'utilisation de sous-requête :

SELECT * FROM your_table WHERE id <=
(SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc
LIMIT $pagesize
Copier après la connexion
Exemple d'utilisation de la connexion :

SELECT * FROM your_table AS t1
JOIN (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;
Copier après la connexion

MySQL utilise une pagination limitée pour de grandes quantités de données. À mesure que le numéro de page augmente, l'efficacité de la requête diminue.

Test d'expérience

1. Utilisez directement le début limite, comptez les instructions de pagination, qui est également la méthode utilisée dans mon programme :

select * from product limit start, count
Copier après la connexion
Lorsque la page de démarrage est petite, il n'y a aucun problème de performances avec la requête Regardons le temps d'exécution de la pagination à partir de 10, 100, 1000 et 10000 (20 entrées par page). .

est le suivant :

select * from product limit 10, 20 0.016秒
select * from product limit 100, 20 0.016秒
select * from product limit 1000, 20 0.047秒
select * from product limit 10000, 20 0.094秒
Copier après la connexion
Nous avons vu que à mesure que l'enregistrement de départ augmente, le temps augmente également. Cela montre que la limite de déclaration de pagination est étroitement liée au numéro de page de départ. changez l'enregistrement de départ en 40w et jetez un œil (c'est-à-dire l'enregistrement moyen)

select * from product limit 400000, 20 3.229秒
Copier après la connexion

Regardons l'heure à laquelle nous récupérons la dernière page des enregistrements

select * from product limit 866613, 20 37.44秒
Copier après la connexion

Le plus grand numéro de page pour paginer comme cette page Apparemment, ce genre de temps est intolérable.

On peut également en conclure deux choses :

Le temps d'interrogation de l'instruction limite est proportionnel à la position de l'enregistrement de départ

L'instruction limite de mysql est très pratique, mais il ne convient pas à une utilisation directe pour les tables contenant de nombreux enregistrements.

  1. 2. Méthode d'optimisation des performances pour limiter le problème de pagination

  2. Utilisez l'index de couverture de la table pour accélérer la requête de pagination

Nous Comme nous le savons tous, si l'instruction qui utilise une requête d'index ne contient que cette colonne d'index (couvrant l'index), alors la requête sera très rapide. Étant donné qu'il existe un algorithme d'optimisation pour la recherche d'index et que les données se trouvent sur l'index de requête, il n'est pas nécessaire de trouver l'adresse des données pertinente, ce qui permet de gagner beaucoup de temps. De plus, il existe également un cache d'index associé dans Mysql. Il est préférable d'utiliser le cache lorsque la concurrence est élevée.

Dans notre exemple, nous savons que le champ id est la clé primaire, il contient donc naturellement l'index de clé primaire par défaut. Voyons maintenant comment fonctionne la requête utilisant l'index de couverture.

Cette fois, nous interrogeons les données de la dernière page (en utilisant un index de couverture, incluant uniquement la colonne id), comme suit :

select id from product limit 866613, 20 0.2秒
Copier après la connexion

Par rapport aux 37,44 secondes d'interrogation de toutes les colonnes, cela s'est amélioré d'environ plus de 100 fois plus vite

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
Copier après la connexion

查询时间为0.2秒!

另一种写法

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
Copier après la connexion

查询时间也很短!

3. 复合索引优化方法

MySql 性能到底能有多高?MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了。

用事实说话,看例子:

数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。最后collect 为 10万条记录,数据库表占用硬1.6G。

OK ,看下面这条sql语句:

select id,title from collect limit 1000,10;
Copier après la connexion

很快;基本上0.01秒就OK,再看下面的

select id,title from collect limit 90000,10;
Copier après la connexion

从9万条开始分页,结果?

8-9秒完成,my god 哪出问题了?其实要优化这条数据,网上找得到答案。看下面一条语句:

select id from collect order by id limit 90000,10;
Copier après la connexion
Copier après la connexion

很快,0.04秒就OK。为什么?因为用了id主键做索引当然快。网上的改法是:

select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;
Copier après la connexion

这就是用了id做索引的结果。可是问题复杂那么一点点,就完了。看下面的语句

select id from collect where vtype=1 order by id limit 90000,10;
Copier après la connexion

很慢,用了8-9秒!

到了这里我相信很多人会和我一样,有崩溃感觉!vtype 做了索引了啊?怎么会慢呢?vtype做了索引是不错,你直接

select id from collect where vtype=1 limit 1000,10;
Copier après la connexion
Copier après la connexion

是很快的,基本上0.05秒,可是提高90倍,从9万开始,那就是0.05*90=4.5秒的速度了。和测试结果8-9秒到了一个数量级。

从这里开始有人提出了分表的思路,这个和dis #cuz 论坛是一样的思路。思路如下:

建一个索引表:t (id,title,vtype) 并设置成定长,然后做分页,分页出结果再到 collect 里面去找info 。是否可行呢?实验下就知道了。

10万条记录到 t(id,title,vtype) 里,数据表大小20M左右。用

select id from collect where vtype=1 limit 1000,10;
Copier après la connexion
Copier après la connexion

很快了。基本上0.1-0.2秒可以跑完。为什么会这样呢?我猜想是因为collect 数据太多,所以分页要跑很长的路。limit 完全和数据表的大小有关的。其实这样做还是全表扫描,只是因为数据量小,只有10万才快。OK, 来个疯狂的实验,加到100万条,测试性能。加了10倍的数据,马上t表就到了200多M,而且是定长。还是刚才的查询语句,时间是0.1-0.2秒完成!分表性能没问题?

错!因为我们的limit还是9万,所以快。给个大的,90万开始

select id from t where vtype=1 order by id limit 900000,10;
Copier après la connexion

看看结果,时间是1-2秒!why ?

分表了时间还是这么长,非常之郁闷!有人说定长会提高limit的性能,开始我也以为,因为一条记录的长度是固定的,mysql 应该可以算出90万的位置才对啊?可是我们高估了mysql 的智能,他不是商务数据库,事实证明定长和非定长对limit影响不大?怪不得有人说discuz到了100万条记录就会很慢,我相信这是真的,这个和数据库设计有关!

难道MySQL 无法突破100万的限制吗???到了100万的分页就真的到了极限?

答案是:NO 为什么突破不了100万是因为不会设计mysql造成的。下面介绍非分表法,来个疯狂的测试!一张表搞定100万记录,并且10G 数据库,如何快速分页!

好了,我们的测试又回到 collect表,开始测试结论是:

30万数据,用分表法可行,超过30万他的速度会慢道你无法忍受!当然如果用分表+我这种方法,那是绝对完美的。但是用了我这种方法后,不用分表也可以完美解决!

答案就是:复合索引!有一次设计mysql索引的时候,无意中发现索引名字可以任取,可以选择几个字段进来,这有什么用呢?

开始的

select id from collect order by id limit 90000,10;
Copier après la connexion
Copier après la connexion

这么快就是因为走了索引,可是如果加了where 就不走索引了。抱着试试看的想法加了 search(vtype,id) 这样的索引。

然后测试

select id from collect where vtype=1 limit 90000,10;
Copier après la connexion

非常快!0.04秒完成!

再测试:

select id ,title from collect where vtype=1 limit 90000,10;
Copier après la connexion

非常遗憾,8-9秒,没走search索引!

再测试:search(id,vtype),还是select id 这个语句,也非常遗憾,0.5秒。

综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!

完美解决了分页问题了。可以快速返回id就有希望优化limit , 按这样的逻辑,百万级的limit 应该在0.0x秒就可以分完。看来mysql 语句的优化和索引时非常重要的!

Recommandé : "Tutoriel 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

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.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

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 !

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)

Comment ouvrir phpmyadmin Comment ouvrir phpmyadmin Apr 10, 2025 pm 10:51 PM

Vous pouvez ouvrir PHPMYADMIN via les étapes suivantes: 1. Connectez-vous au panneau de configuration du site Web; 2. Trouvez et cliquez sur l'icône PHPMYADMIN; 3. Entrez les informations d'identification MySQL; 4. Cliquez sur "Connexion".

MySQL: une introduction à la base de données la plus populaire au monde MySQL: une introduction à la base de données la plus populaire au monde Apr 12, 2025 am 12:18 AM

MySQL est un système de gestion de la base de données relationnel open source, principalement utilisé pour stocker et récupérer les données rapidement et de manière fiable. Son principe de travail comprend les demandes des clients, la résolution de requête, l'exécution des requêtes et les résultats de retour. Des exemples d'utilisation comprennent la création de tables, l'insertion et la question des données et les fonctionnalités avancées telles que les opérations de jointure. Les erreurs communes impliquent la syntaxe SQL, les types de données et les autorisations, et les suggestions d'optimisation incluent l'utilisation d'index, les requêtes optimisées et la partition de tables.

Place de MySQL: bases de données et programmation Place de MySQL: bases de données et programmation Apr 13, 2025 am 12:18 AM

La position de MySQL dans les bases de données et la programmation est très importante. Il s'agit d'un système de gestion de base de données relationnel open source qui est largement utilisé dans divers scénarios d'application. 1) MySQL fournit des fonctions efficaces de stockage de données, d'organisation et de récupération, en prenant en charge les systèmes Web, mobiles et de niveau d'entreprise. 2) Il utilise une architecture client-serveur, prend en charge plusieurs moteurs de stockage et optimisation d'index. 3) Les usages de base incluent la création de tables et l'insertion de données, et les usages avancés impliquent des jointures multiples et des requêtes complexes. 4) Des questions fréquemment posées telles que les erreurs de syntaxe SQL et les problèmes de performances peuvent être déboguées via la commande Explication et le journal de requête lente. 5) Les méthodes d'optimisation des performances comprennent l'utilisation rationnelle des indices, la requête optimisée et l'utilisation des caches. Les meilleures pratiques incluent l'utilisation des transactions et des acteurs préparés

Pourquoi utiliser MySQL? Avantages et avantages Pourquoi utiliser MySQL? Avantages et avantages Apr 12, 2025 am 12:17 AM

MySQL est choisi pour ses performances, sa fiabilité, sa facilité d'utilisation et son soutien communautaire. 1.MySQL fournit des fonctions de stockage et de récupération de données efficaces, prenant en charge plusieurs types de données et opérations de requête avancées. 2. Adoptez l'architecture client-serveur et plusieurs moteurs de stockage pour prendre en charge l'optimisation des transactions et des requêtes. 3. Facile à utiliser, prend en charge une variété de systèmes d'exploitation et de langages de programmation. 4. Avoir un solide soutien communautaire et fournir des ressources et des solutions riches.

Comment se connecter à la base de données d'Apache Comment se connecter à la base de données d'Apache Apr 13, 2025 pm 01:03 PM

Apache se connecte à une base de données nécessite les étapes suivantes: Installez le pilote de base de données. Configurez le fichier web.xml pour créer un pool de connexion. Créez une source de données JDBC et spécifiez les paramètres de connexion. Utilisez l'API JDBC pour accéder à la base de données à partir du code Java, y compris l'obtention de connexions, la création d'instructions, les paramètres de liaison, l'exécution de requêtes ou de mises à jour et de traitement des résultats.

Comment démarrer MySQL par Docker Comment démarrer MySQL par Docker Apr 15, 2025 pm 12:09 PM

Le processus de démarrage de MySQL dans Docker se compose des étapes suivantes: Tirez l'image MySQL pour créer et démarrer le conteneur, définir le mot de passe de l'utilisateur racine et mapper la connexion de vérification du port Créez la base de données et l'utilisateur accorde toutes les autorisations sur la base de données

CentOS installe MySQL CentOS installe MySQL Apr 14, 2025 pm 08:09 PM

L'installation de MySQL sur CENTOS implique les étapes suivantes: Ajout de la source MySQL YUM appropriée. Exécutez la commande YUM Install MySQL-Server pour installer le serveur MySQL. Utilisez la commande mysql_secure_installation pour créer des paramètres de sécurité, tels que la définition du mot de passe de l'utilisateur racine. Personnalisez le fichier de configuration MySQL selon les besoins. Écoutez les paramètres MySQL et optimisez les bases de données pour les performances.

Rôle de MySQL: Bases de données dans les applications Web Rôle de MySQL: Bases de données dans les applications Web Apr 17, 2025 am 12:23 AM

Le rôle principal de MySQL dans les applications Web est de stocker et de gérer les données. 1.MySQL traite efficacement les informations utilisateur, les catalogues de produits, les enregistrements de transaction et autres données. 2. Grâce à SQL Query, les développeurs peuvent extraire des informations de la base de données pour générer du contenu dynamique. 3.MySQL fonctionne basé sur le modèle client-serveur pour assurer une vitesse de requête acceptable.

See all articles