ordre Mysql par piège et de mélange limite

Mysql, nous utilisons souvent par ordre de trier, de limiter l'utilisation de la pagination, lorsque le besoin de pages de tri, nous avons tendance à utiliser un libellé similaire select * de l'ordre de nom de la table par le champ de tri limt M, N. Cependant, une telle approche a été l'utilisation de pièges profonds cachés. Sous les données en double champ de tri, le problème de grouper les résultats serait incompatible avec la tendance attendue.

Exemple, il existe une table utilisateur, et la structure de la table de données est la suivante:

Maintenant, je veux créer une requête basée sur la table utilisateur de temps ascendant et une requête d'appel, page 2, il est très facile d'écrire SQL: select * de l'ordre de l'utilisateur par create_time pageno limite, 2;

Au cours de l'exécution de la requête, vous trouverez:

1, la première page des données de la requête:

2, la quatrième page des données de la requête:

Un total de huit données de la table utilisateur, il y a quatre données, mais le processus réel d'enquête sur la première page et la quatrième page avait en fait les mêmes données.

Quelle est la situation? Est pas la première ci-dessus des requêtes SQL de pagination sur deux tables connexes, puis triés, puis prendre les données correspondant à la pagination de celui-ci? ? ?

La mise en uvre effective des résultats ci-dessus ont prouvé la réalité et de l'imagination souvent il y a un écart, pas exécuté comme décrit ci-dessus l'exécution réelle SQL. En fait, voici la limite Mysql fera l'optimisation, les optimisations spécifiques, voir le document officiel: https: //dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

Ceci est la version 5.7 des instructions, les instructions de plusieurs questions directement liées au point d'extraction à faire.

Il y a des documents officiels mentionnés ci-dessus, si vous commandez par le row_count Limit et mélanger, MySQL trouver la ligne row_count triée immédiatement après le retour, plutôt que l'ensemble de tri des résultats de requête en arrière. Si l'indice est de trier, très rapidement, si le fichier est triée, seront sélectionnés, la sélection la plupart ou tous seront classés jusqu'à ce que les exigences limites ROW_COUNT ont été trouvés toutes les lignes correspondant à la requête (sans limite de). Si la limite requise ligne row_count une fois trouvé, Mysql ne sorte le résultat régler le reste de la ligne.

Nous examinons ici le plan d'exécution SQL correspondant:

Peut confirmer que pour trier les documents, tableaux ne correspondent pas vraiment des indices supplémentaires. On peut donc être sûr que lorsque l'exécution SQL trouvera la ligne de limite requise immédiatement après les résultats de la requête de retour.

Mais même si elle retourne immédiatement, la pagination Pourquoi ne le permettrait pas?

Le document officiel qui a fait la remarque suivante:

Si un champ comporte une pluralité de rangées afin d'avoir la même valeur, mysql obtenir des résultats dans un ordre aléatoire, en particulier dépendent correspondant plan d'exécution. Cela signifie que si la colonne de tri est désordonné, l'ordre de tri des lignes de résultat est incertain.

Sur la base de ce savoir de base pourquoi nous ne sommes pas autorisés à être paginée, parce que nous sorte de champ est create_time, il y a quelques-uns de la même valeur de ligne, les résultats de la ligne de commande de retour correspondant est incertain au moment de la mise en uvre effective. Correspondant au cas ci-dessus, la première page du nom retourné de la ligne de données 8, peut être juste la surface supérieure, tandis que la quatrième page 8 données de ligne nom de la requête juste à l'arrière, de sorte que la quatrième page est apparue.

Que cette situation devrait être comment le résoudre?

Le fonctionnaire donne la solution:

Si vous voulez présence ou l'absence d'une limite dans les mêmes résultats de tri sont garantis, plus un critère de tri supplémentaires possibles. Pour champ exemple id est unique, pensez à commander des champs supplémentaires pour assurer un id ordre de tri stable.

Par conséquent, le cas ci-dessus peut ajouter un champ de tri dans SQL, comme champ id fund_flow, donc problème de pagination est résolu. SQL peut être modifié comme suit:

SELECT * FROM utilisateur ORDER BY create_time, id LIMIT 6,2;

Testez à nouveau pour résoudre le problème! !

l'architecture en couches, base de données Pourquoi introduire une couche intermédiaire
Précédent
voiture femme australienne de fumer tiré du feu pris de voiture et a explosé deux secondes après deux évasion bébé
Prochain
Tôt ou tard porter la pluie respect Qiuku au sud de l'automne bat son plein
Où est allé l'argent après 90? Voici une nouvelle génération de « l'aspect fiscal » modèles investissement et de consommation
L'équipe de Ma a alerté les outils de bureau: Tencent profil bas documentation en ligne
la surveillance par satellite de télédétection du glissement de terrain de la rivière Jinsha lac endigué
La Liga Roundup: Séville Société royale triomphe de la maison, la victoire sur Valladolid Leganes
Shijiazhuang, Hebei Sendai colline feuilles dans la meilleure période de visualisation
Order Center, comment faire la base de données de capacité illimitée
l'architecture en couches Internet, pourquoi vous voulez séparer l'extrémité avant et arrière?
2499 première femme Xiaolong 835 rouges jeux de libération de téléphone Nubian
Li Ka-shing de l'exposition "Nouvel An"! Un repas, voir une éducation familiale
« Wandering la Terre » au box-office la première contre-attaque! Ng Man Tat: Quand vous lisez le script, ne croyons pas qu'il est écrit en chinois
annotations d'utilisation « Java » et de réflexion pour réaliser une injection de dépendance de version « faible »