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

NULL in MySQL (Leistung &Speicher)

Das hängt davon ab, welche Speicher-Engine Sie verwenden.

Im MyISAM-Format enthält jeder Zeilenkopf ein Bitfeld mit einem Bit für jede Spalte, um den NULL-Zustand zu codieren. Eine Spalte, die NULL ist, nimmt immer noch Speicherplatz ein, sodass NULL-Werte den Speicherplatz nicht reduzieren. Siehe https://dev.mysql.com/doc/internals/ de/myisam-einführung.html

In InnoDB hat jede Spalte einen "Field Start Offset" im Zeilenheader, der ein oder zwei Bytes pro Spalte beträgt. Das hohe Bit in diesem Feldstart-Offset ist eingeschaltet, wenn die Spalte NULL ist. In diesem Fall muss die Spalte überhaupt nicht gespeichert werden. Wenn Sie also viele NULL-Werte haben, sollte Ihr Speicherplatz erheblich reduziert werden. Siehe https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

BEARBEITEN:

Die NULL-Bits sind Teil der Zeilenköpfe, Sie fügen sie nicht hinzu.

Die einzige Möglichkeit, wie ich mir vorstellen kann, dass NULLs die Leistung verbessern, besteht darin, dass in InnoDB eine Seite mit Daten möglicherweise mehr Zeilen enthält, wenn die Zeilen NULLen enthalten. Daher sind Ihre InnoDB-Puffer möglicherweise effektiver.

Es würde mich aber sehr wundern, wenn dies in der Praxis einen deutlichen Performance-Vorteil bringt. Die Sorge um die Auswirkungen von NULL-Werten auf die Leistung gehört in den Bereich der Mikrooptimierung. Sie sollten Ihre Aufmerksamkeit auf andere Bereiche richten, auf Bereiche, die mehr für das Geld bringen. Zum Beispiel das Hinzufügen gut ausgewählter Indizes oder die Erhöhung der Datenbank-Cache-Zuweisung.