Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sollten VARCHAR-Spalten am Ende von Tabellendefinitionen in MySQL eingefügt werden?

Diese Frage zu "MySQL" zu stellen, ist nicht hilfreich, da MySQL Speicher auf Speicher-Engines verbannt und diese Speicher auf sehr unterschiedliche Weise implementieren. Es ist sinnvoll, diese Frage für jede einzelne Speicher-Engine zu stellen.

In der MEMORY-Engine existieren keine Datentypen variabler Länge. Ein VARCHAR wird stillschweigend in ein CHAR umgewandelt. Im Zusammenhang mit Ihrer Frage:Es spielt keine Rolle, wo Sie in einer Tabellendefinition Ihren VARCHAR einfügen.

Wenn in der MyISAM-Engine eine Tabelle überhaupt keine Daten variabler Länge hat (VARCHAR, VARBINARY oder irgendein TEXT- oder BLOB-Typ), ist sie von der FIXED-Variante von MyISAM, d. h. Datensätze haben eine feste Bytelänge. Dies kann Auswirkungen auf die Leistung haben, insbesondere wenn Daten wiederholt gelöscht und eingefügt werden (d. h. die Tabelle wird nicht nur angehängt). Sobald ein Datentyp mit variabler Länge Teil einer Tabellendefinition ist, wird er zur DYNAMIC-Variante von MyISAM, und MyISAM ändert intern jeden außer dem kürzesten CHAR-Typ intern in VARCHAR. Auch hier spielt die Position und sogar die Definition von CHAR/VARCHAR keine Rolle.

In der InnoDB-Engine werden Daten in Seiten mit einer Größe von 16 KB gespeichert. Eine Seite hat einen Seitenfuß mit einer Prüfsumme und einen Seitenkopf mit ua einem Seitenverzeichnis. Das Seitenverzeichnis enthält für jede Zeile den Offset dieser Zeile relativ zum Anfang der Seite. Eine Seite enthält auch freien Speicherplatz, und alle I/Os werden in Seiten ausgeführt.

Daher kann InnoDB, solange auf einer Seite freier Speicherplatz vorhanden ist, VARCHAR an Ort und Stelle vergrößern und Zeilen innerhalb einer Seite verschieben, ohne dass zusätzliche I/O-Vorgänge erforderlich sind. Da außerdem alle Zeilen als (Seitennummer, Seitenverzeichniseintrag) adressiert werden, ist die Bewegung einer Zeile innerhalb einer Seite auf die Seite lokalisiert und von außen nicht sichtbar.

Das bedeutet auch, dass auch für InnoDB die Reihenfolge der Spalten innerhalb einer Zeile überhaupt keine Rolle spielt.

Dies sind die drei Speicher-Engines, die am häufigsten mit MySQL verwendet werden, und die Reihenfolge der Spalten spielt für keine dieser drei eine Rolle. Es kann sein, dass es andere, exotischere Speicher-Engines gibt, für die dies nicht gilt.