Lorsque nous affichons le contenu dans une liste, nous rencontrerons inévitablement des problèmes de pagination, car la quantité de contenu dans la liste peut être importante, mais la taille de l'interface que les utilisateurs peuvent voir en même temps est limitée, et c'est impossible d'afficher tout le contenu sur une seule interface, récupérer trop de données du backend à la fois entraînera également une pression supplémentaire sur le backend. La pagination MySQL est une fonction que nous rencontrons souvent dans le développement. Récemment, nous avons rencontré un problème lors de l'implémentation de cette fonction. Par conséquent, cet article vous présente principalement l'expérience d'optimisation SQL du décalage excessif lors de la pagination MySQL. a une certaine valeur de référence et d'apprentissage pour les études ou le travail de chacun. Les amis qui en ont besoin peuvent suivre l'éditeur pour y jeter un œil.
Habituellement, une telle instruction est utilisée lors de l'exécution de requêtes de pagination :
SELECT * FROM table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000
Lorsque le décalage est particulièrement important, l'efficacité d'exécution de cette instruction sera considérablement réduit et l’efficacité diminue à mesure que le décalage augmente.
La raison est :
MySQL n'ignore pas la ligne de décalage, mais prend la ligne offset+N, puis renvoie la ligne de décalage Avant d'abandonner, de renvoyer N lignes, lorsque le décalage est particulièrement grand et que la donnée unique est également volumineuse, il faut obtenir plus de données pour chaque requête, ce qui sera naturellement très lent.
Plan d'optimisation :
SELECT * FROM table JOIN (select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) as tmp using(id)
ou
SELECT a.* FROM table a, (select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) b where a.id = b.id
Obtenez d'abord la liste des clés primaires, puis interrogez les données cibles via la clé primaire Même si le décalage est important, de nombreuses clés primaires sont obtenues au lieu de tous les champs. données Relativement parlant, l'efficacité sera inférieure. Beaucoup d'amélioration.
Recommandations associées :
Résumé de l'optimisation MySQL - nombre total de requêtes
Résumé de la requête d'instruction SQL d'optimisation MySQL couramment utilisée méthodes
L'optimisation MySQL comprend trois aspects
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!