Was genau macht null in Bezug auf Leistung und Speicher (Speicherplatz) in MySQL?
Zum Beispiel:
TINYINT: 1 Byte TINYINT mit NULL 1 Byte + speichert irgendwie NULL?
Dies 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-Status zu codieren. Eine Spalte, die NULL ist, belegt immer noch Speicherplatz, sodass NULL-Speicher den Speicher nicht reduzieren. Siehe https://dev.mysql.com/doc/internals/en/myisam-introduction.html
In InnoDB hat jede Spalte einen "Feldstartversatz" im Zeilenkopf, der ein oder zwei Bytes pro Spalte beträgt. Das hohe Bit in diesem Feldstartversatz ist aktiviert, wenn die Spalte NULL ist. In diesem Fall muss die Spalte überhaupt nicht gespeichert werden. Wenn Sie also viele NULL-Werte haben, sollte Ihr Speicher erheblich reduziert werden. Siehe https://dev.mysql.com/doc/internals/en/innodb-field-contents.html
BEARBEITEN:
Die NULL-Bits sind Teil der Zeilenüberschriften. Sie können sie nicht hinzufügen.
Ich kann mir nur vorstellen, dass NULLs die Leistung verbessern, wenn in InnoDB eine Datenseite mehr Zeilen enthält, wenn die Zeilen NULLs enthalten. Ihre InnoDB-Puffer sind möglicherweise effektiver.
Ich wäre jedoch sehr überrascht, wenn dies in der Praxis einen erheblichen Leistungsvorteil bietet. Die Sorge um die Auswirkungen von NULL auf die Leistung liegt im Bereich der Mikrooptimierung. Sie sollten Ihre Aufmerksamkeit an anderer Stelle konzentrieren, in Bereichen, die mehr Geld kosten. Zum Beispiel das Hinzufügen ausgewählter Indizes oder das Erhöhen der Datenbank-Cache-Zuordnung.
Bills Antwort ist gut, aber etwas veraltet. Die Verwendung von ein oder zwei Bytes zum Speichern von NULL gilt nur für das Zeilenformat InnoDB REDUNDANT. Da MySQL 5.0.3 InnoDB das Zeilenformat COMPACT verwendet, das nur ein Bit zum Speichern eines NULL verwendet (natürlich ist ein Byte das Minimum), gilt Folgendes:
Erforderlicher Speicherplatz für NULL-Werte = CEILING-Bytes (N / 8), wobei N die Anzahl der NULL-Spalten in einer Zeile ist.
Laut der offiziellen MySQL-Site über COMPACT vs REDUNDANT:
Vorteil der Verwendung von NULL gegenüber leeren Zeichenfolgen oder Nullen:
Hier sehen Sie die Einsparungen:
Andererseits schlage ich vor, NULL-Werte über leeren Zeichenfolgen oder Nullen zu verwenden, da diese organisierter und portabler sind und weniger Speicherplatz benötigen. Um die Leistung zu verbessern und Platz zu sparen, konzentrieren Sie sich auf die Verwendung der richtigen Datentypen, Indizes und Abfragen anstelle von seltsamen Tricks.
Weitere Informationen finden Sie unter : https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html
quelle
Ich würde Bill Karwin zustimmen, obwohl ich diese MySQL-Tipps hinzufügen würde . Nummer 11 spricht dies speziell an:
Andererseits verwende ich immer noch null für Tabellen, die nicht viele Zeilen enthalten, hauptsächlich, weil mir die Logik gefällt, NICHT NULL zu sagen.
Update Wenn ich das später noch einmal betrachte, möchte ich hinzufügen, dass ich persönlich nicht gerne 0 anstelle von NULL in der Datenbank verwende, und ich empfehle es nicht. Dies kann leicht zu vielen Fehlalarmen in Ihrer Anwendung führen, wenn Sie nicht vorsichtig sind.
quelle
dev.mysql.com/doc/refman/5.0/de/is-null-optimization.html
MySQL kann für col_name IS NULL dieselbe Optimierung durchführen, die es für col_name = constant_value verwenden kann. Beispielsweise kann MySQL Indizes und Bereiche verwenden, um mit IS NULL nach NULL zu suchen
quelle