Warum MySQL-Datenbanken NULL so weit wie möglich vermeiden

Warum MySQL-Datenbanken NULL so weit wie möglich vermeiden

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ünde

Grund 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
Der Ursprung von 32 in Explain1 ist: 10 (Feldlänge) * 3 (Länge, die durch die UTF-8-Zeichenkodierung belegt wird) + 2 (Länge, die durch Varchar als variable Länge belegt wird)
Die Zahl 32 von Explain2 ergibt sich aus: 10 (Feldlänge) * 3 (Länge, die durch die UTF-8-Zeichenkodierung belegt wird) + 2 (Länge, die durch varchar als variable Länge belegt wird) + 1 (Länge, die durch den Nullmarker belegt wird)

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:
  • MySQL-Abfrage für leere oder nicht leere Felder (ist null und nicht null)
  • Anweisung zum Konvertieren eines Nullwerts in 0 in MySQL
  • Sollten nullbare Felder in MySQL auf NULL oder NOT NULL gesetzt werden?
  • MySQL NULL-Datenkonvertierungsmethode (unbedingt lesen)
  • So erstellen Sie einen eindeutigen Index, wenn in MySQL Null und Leerzeichen vorhanden sind
  • Eine kurze Erläuterung der ifnull()-Funktion ähnlich der nvl()-Funktion in MySQL
  • Tutorial zum Verstehen und Verwenden von NULL-Werten in MySQL
  • Detaillierte Erklärung der Verwendung von IFNULL, NULLIF und ISNULL in MySql
  • Detaillierte Erklärung zu Unique Constraints und NULL in MySQL

<<:  JavaScript zum Erzielen eines Fortschrittsbalkeneffekts

>>:  Implementierung eines CSS-Festlayouts auf beiden Seiten und eines adaptiven Layouts in der Mitte

Artikel empfehlen

5 einfache XHTML-Webformulare für Webdesign

Einfaches XHTML-Webformular im Webdesign 5. Techn...

Eine kurze Diskussion zum Problem von Daten mit Nullwerten in der MySQL-Datenbank

Standardmäßig akzeptiert MySQL das Einfügen von 0...

Lösung zur Deinstallation von Python und Yum im CentOs-System

Hintergrund des Unfalls: Vor einigen Tagen habe i...

Grafisches Tutorial zur Offline-Installation und Konfiguration von MySQL 8.0.2

Die Offline-Installationsmethode von MySQL_8.0.2 ...

Lösung für den Fehler 1045, wenn Navicat eine Verbindung zu MySQL herstellt

Beim Herstellen einer Verbindung mit der lokalen ...

Vue implementiert ein einfaches Einkaufswagenbeispiel

In diesem Artikel wird der spezifische Code von V...

So fügen Sie img-Bilder in Vue-Seiten ein

Wenn wir HTML lernen, führt das Bild-Tag <img&...

So schreiben Sie ein MySQL-Sicherungsskript

Vorwort: Die Bedeutung einer Datenbanksicherung l...

MySQL 5.6.37 (zip) Download Installationskonfiguration Grafik-Tutorial

In diesem Artikel finden Sie das Download-, Insta...

Implementierung des CSS-Ladeeffekts Pac-Man

emmm, der Name ist nur eine zufällige Vermutung 2...

Zehn Erfahrungen bei der Präsentation chinesischer Webinhalte

<br /> Ich habe mich auf die drei Aspekte Te...

Entwurf und Implementierung einer kaskadierenden Dropdown-Box in Vue

Inhaltsverzeichnis 1. Datenbankdesign 2. Frontend...