Viele Tabellen in MySQL enthalten Spalten, die NULL (leere Werte) sein können, auch wenn die Anwendung NULL nicht speichern muss, da NULL das Standardattribut der Spalte ist. In einigen Büchern oder Blogs zur MySQL-Leistungsoptimierung sehen wir jedoch häufig Meinungen: Versuchen Sie, keine NULL-Werte in Datenspalten zu verwenden. Verwenden Sie 0, -1 oder andere spezielle Bezeichner, um NULL-Werte zu ersetzen, es sei denn, Sie müssen wirklich NULL-Werte speichern. Warum also? Welchen Vorteil hätte ein Austausch? Welche Probleme gibt es gleichzeitig? Dann schauen Sie sich Folgendes an: (1) Wenn die Abfrage Spalten enthält, die NULL sein können, ist die Optimierung für MySQL schwieriger, da Spalten, die NULL sein können, Indizes, Indexstatistiken und Wertevergleiche komplizierter machen. (2) Zusammengesetzte Indizes, die NULL enthalten, sind ungültig. (3) Spalten, die NULL sein können, beanspruchen mehr Speicherplatz und erfordern außerdem eine spezielle Verarbeitung in MySQL. (4) Beim Indizieren einer NULL-fähigen Spalte benötigt jeder Indexdatensatz ein zusätzliches Byte, was sogar dazu führen kann, dass aus einem Index mit fester Größe (beispielsweise einem Index für nur eine Integer-Spalte) in MyISAM ein Index mit variabler Größe wird. GründeGrund 1 erfordert keine Beweise Erstellen Sie zunächst eine neue Umgebung. Die SQL-Anweisung lautet wie folgt Tabelle Nulltesttabelle erstellen( id int Primärschlüssel, name_not_null varchar(10) nicht null, name_null varchar(10) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; Tabelle nulltesttabelle ändern, Index idx_nulltesttable_name_not_null(name_not_null) hinzufügen; Tabelle nulltesttabelle ändern, Index idx_nulltesttable_name_null(name_null) hinzufügen; erklären Sie, wählen Sie * aus Nulltesttabelle, wobei Name_nicht_null = "Name" ist; // erklären1 erklären select * from nulltesttable where name_null='name'; // erklären2 Aus der SQL-Ausführung können wir erkennen, dass key_len = 32 in Explain1 und key_len = 33 in Explain2 Verkettet zwei Zeichenfolgen. Wenn die Zeichenfolge einen Nullwert enthält, wird das Ergebnis als Null zurückgegeben. in Nulltesttabelle einfügen (ID, Name_nicht_null, Name_null) Werte (1, „eins“, null); in Nulltesttabelle einfügen (ID, Name_nicht_null, Name_null) Werte (2, „zwei“, „drei“); wähle concat(name_not_null,name_null) aus Nulltesttabelle, wobei ID = 1; -- Ausgabe: null wähle concat(name_not_null,name_null) aus nulltesttable, wobei id = 2; -- out: zweidrei Wenn ein Feld Nullwerte zulässt und indiziert ist, kann die folgende Abfrage falsche Ergebnisse zurückgeben. wähle * aus nulltesttabelle, wobei name_null <> 'drei' -- out: null wähle count(name_null) aus nulltesttable -- out: 1 Im Allgemeinen ist die Leistungsverbesserung durch die Änderung einer NULL-fähigen Spalte in NOT NULL gering. Es besteht daher keine Notwendigkeit, diese Situation zuerst in einem vorhandenen Schema zu finden und zu ändern, es sei denn, Sie sind sicher, dass dies zu Problemen führen wird. Wenn Sie jedoch vorhaben, einen Index für eine Spalte zu erstellen, sollten Sie versuchen, zu vermeiden, dass dieser NULL-Werte enthält. Scheuen Sie sich nicht, NULL zu verwenden, wenn Sie wirklich einen unbekannten Wert identifizieren müssen. In manchen Fällen ist die Verwendung von NULL möglicherweise die bessere Wahl als die Verwendung einer magischen Konstante. Die Auswahl eines unmöglichen Werts aus dem Wertebereich eines bestimmten Typs, z. B. die Verwendung von -1 zur Darstellung einer unbekannten Zahl, kann den Code erheblich komplizierter machen, leicht zu Fehlern führen und auch zu einem Durcheinander führen (Hinweis: MySQL speichert NULL-Werte im Index, Oracle jedoch nicht). Natürlich gibt es Ausnahmen. InnoDB verwendet ein separates Bit zum Speichern von NULL-Werten und bietet daher eine gute Speichereffizienz für spärliche Daten (viele Werte sind NULL und nur wenige Zeilen haben nicht-NULL-Werte in der Spalte). Dies gilt nicht für MyISAM. Deshalb sollte bei der Gestaltung und Überlegung der tatsächliche Bedarf berücksichtigt werden. Damit ist dieser Artikel darüber, warum MySQL-Datenbanken versuchen, NULL zu vermeiden, abgeschlossen. Weitere Informationen dazu, wie MySQL NULL vermeidet, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: JavaScript zum Erzielen eines Fortschrittsbalkeneffekts
>>: Implementierung eines CSS-Festlayouts auf beiden Seiten und eines adaptiven Layouts in der Mitte
Einfaches XHTML-Webformular im Webdesign 5. Techn...
Einführung in Selenium Grid Obwohl einige neue Fu...
Standardmäßig akzeptiert MySQL das Einfügen von 0...
Hintergrund des Unfalls: Vor einigen Tagen habe i...
Die Offline-Installationsmethode von MySQL_8.0.2 ...
Inhaltsverzeichnis 1. Ereignisverarbeitungsmodell...
Beim Herstellen einer Verbindung mit der lokalen ...
In diesem Artikel wird der spezifische Code von V...
Wenn wir HTML lernen, führt das Bild-Tag <img&...
Die Warnhinweise in diesem Artikel haben nichts m...
Vorwort: Die Bedeutung einer Datenbanksicherung l...
In diesem Artikel finden Sie das Download-, Insta...
emmm, der Name ist nur eine zufällige Vermutung 2...
<br /> Ich habe mich auf die drei Aspekte Te...
Inhaltsverzeichnis 1. Datenbankdesign 2. Frontend...