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

Les colonnes VARCHAR doivent-elles être placées à la fin des définitions de table dans MySQL ?

Poser cette question sur "MySQL" n'est pas utile, car MySQL relègue le stockage aux moteurs de stockage, et ils implémentent le stockage de manière très différente. Il est logique de poser cette question pour n'importe quel moteur de stockage individuel.

Dans le moteur MEMORY, les types de données de longueur variable n'existent pas. Un VARCHAR est silencieusement changé en CHAR. Dans le contexte de votre question :peu importe où vous placez votre VARCHAR dans une définition de table.

Dans le moteur MyISAM, si une table ne contient aucune donnée de longueur variable (VARCHAR, VARBINARY ou tout autre type TEXT ou BLOB), elle est de la variante FIXED de MyISAM, c'est-à-dire que les enregistrements ont une longueur fixe en octets. Cela peut avoir des implications sur les performances, en particulier si les données sont supprimées et insérées à plusieurs reprises (c'est-à-dire que la table n'est pas uniquement ajoutée). Dès qu'un type de données de longueur variable fait partie d'une définition de table, il devient la variante DYNAMIC de MyISAM, et MyISAM modifie en interne tout type CHAR sauf le plus court en VARCHAR. Encore une fois, la position et même la définition de CHAR/VARCHAR n'ont pas d'importance.

Dans le moteur InnoDB, les données sont stockées dans des pages de 16 Ko. Une page a un pied de page avec une somme de contrôle, et un en-tête de page, avec entre autres un répertoire de pages. Le répertoire de la page contient pour chaque ligne le décalage de cette ligne par rapport au début de la page. Une page contient également de l'espace libre et toutes les E/S sont effectuées dans des pages.

Par conséquent, InnoDB peut, tant qu'il y a de l'espace libre dans une page, développer VARCHAR en place et déplacer des lignes à l'intérieur d'une page, sans entraîner d'E/S supplémentaires. De plus, étant donné que toutes les lignes sont adressées comme (numéro de page, entrée de répertoire de page), le mouvement d'une ligne à l'intérieur d'une page est localisé sur la page et n'est pas visible de l'extérieur.

Cela signifie également que pour InnoDB également, l'ordre des colonnes à l'intérieur d'une ligne n'a aucune importance.

Ce sont les trois moteurs de stockage les plus couramment utilisés avec MySQL, et l'ordre des colonnes n'a d'importance pour aucun de ces trois moteurs. Il se peut que d'autres moteurs de stockage plus exotiques existent pour lesquels ce n'est pas vrai.