Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vitesse de requête basée sur l'ordre des colonnes

La réponse est oui, c'est important, et cela peut avoir beaucoup d'importance, mais habituellement pas grand-chose.

Toutes les E/S sont effectuées au niveau de la page (généralement 2K ou 4K selon votre système d'exploitation). Les données de colonne pour les lignes sont stockées les unes à côté des autres, sauf lorsque la page est pleine, auquel cas les données sont écrites sur une autre page (généralement la suivante).

Plus l'espace de données sur disque requis pour les colonnes entre (selon la définition de la table) les colonnes que vous sélectionnez est grand, plus il y a de chances que les données des colonnes sélectionnées soient (parfois) sur des pages différentes. Le fait d'être sur une page différente peut entraîner une opération d'E/S supplémentaire (si aucune autre ligne n'est sélectionnée sur l'autre page). Dans le pire des cas, chaque colonne que vous sélectionnez pourrait se trouver sur une page différente.

Voici un exemple :

create table bad_layout (
num1 int,
large1 varchar(4000),
num2 int,
large2 varchar(4000),
num3 int,
large3 varchar(4000)
);

create table better_layout (
num1 int,
num2 int,
num3 int,
large1 varchar(4000),
large2 varchar(4000),
large3 varchar(4000)
);

Comparaison : sélectionnez num1, num2, num3 dans bad_layout ; sélectionnez num1, num2, num3 dans better_layout ;

Étant donné que pour bad_layout, chaque colonne num sera essentiellement sur une page différente, chaque ligne nécessitera 3 opérations d'e/s. Inversement, pour better_layout, num colonnes seront généralement sur la même page.

La requête bad_layout est susceptible de prendre environ 3 fois plus de temps à s'exécuter.

Une bonne disposition de table peut faire une grande différence pour les performances des requêtes. Vous devriez essayer de garder les colonnes qui sont généralement sélectionnées ensemble aussi proches que possible les unes des autres dans la disposition du tableau.