Maison > base de données > tutoriel mysql > Comment MySQL détermine-t-il l'ordre des lignes dans les requêtes « SELECT * FROM table_name ; » ?

Comment MySQL détermine-t-il l'ordre des lignes dans les requêtes « SELECT * FROM table_name ; » ?

DDD
Libérer: 2024-12-08 22:43:10
original
660 Les gens l'ont consulté

How Does MySQL Determine Row Order in `SELECT * FROM table_name;` Queries?

Détermination de l'ordre des lignes dans MySQL pour "SELECT * FROM table_name;"`

Lors de l'exécution d'un "SELECT * FROM table_name;" requête sans clause ORDER BY, MySQL ne fournit aucune garantie concernant l'ordre des lignes de l'ensemble de résultats.

Dépendance des détails d'implémentation

Sauf explicitement spécifié à l'aide d'un ORDER BY, l'ordre des lignes est entièrement soumis aux spécificités d'implémentation internes du moteur SGBDR de MySQL. Cela peut varier en fonction de facteurs tels que la sélection de l'index, la disposition du stockage et les techniques d'optimisation utilisées par le moteur.

Implications pratiques

Bien qu'il soit possible que les lignes soient renvoyés dans leur ordre d'insertion d'origine ou leur séquence de stockage physique à l'occasion, il est déconseillé de s'appuyer sur ce comportement. En effet, le passage à un autre SGBDR ou même la mise à niveau vers une version plus récente de MySQL pourrait entraîner un ordre de lignes différent.

Exceptions avec InnoDB

En pratique, le stockage InnoDB Le moteur a tendance à renvoyer les lignes en fonction de l'ordre dans lequel il les récupère à partir de l'index utilisé par l'optimiseur de requêtes. Cela signifie que l'ordre peut varier en fonction de l'index spécifique sélectionné.

Exemple

Considérez la démonstration suivante en utilisant InnoDB :

CREATE TABLE foo (id SERIAL PRIMARY KEY, bar CHAR(10), baz CHAR(10), KEY(bar));

INSERT INTO foo (bar, baz) VALUES
  ('test5', 'test5'), ('test5', 'test5'),
  ('test4', 'test4'), ('test4', 'test4'), 
  ('test3', 'test3'), ('test3', 'test3'), 
  ('test2', 'test2'), ('test2', 'test2'), 
  ('test1', 'test1'), ('test1', 'test1');
Copier après la connexion

Par défaut , les lignes sont renvoyées dans l'ordre de la clé primaire (index clusterisé).

select * from foo;
Copier après la connexion

Cependant, l'utilisation explicite d'un index peut changer l'ordre :

select * from foo where bar between 'test2' and 'test4';
Copier après la connexion

Dans ce cas, l'ordre est dicté par l'index secondaire sur la colonne barre.

Différences sous MyISAM

L'utilisation d'un moteur de stockage différent comme MyISAM peut entraîner des comportements différents. Dans MyISAM, les lignes sont généralement stockées dans l'ordre d'insertion, ce qui conduit à un ordre de lignes par défaut différent de celui d'InnoDB.

En conclusion, pour garantir un ordre de lignes cohérent dans vos requêtes SQL, utilisez toujours une clause ORDER BY explicite. S'appuyer sur des mécanismes de classement par défaut peut entraîner des résultats inattendus et des problèmes potentiels d'intégrité des données.

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal