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

Detaillierte Erklärung der Lösung zum Vergessen des Passworts in MySQL 5.7

Umwelt: [root@centos7 ~]# uname -r 3.10.0-514.el7...

Detaillierte Anweisungen zur Installation von SuPHP auf CentOS 7.2

Standardmäßig wird PHP unter CentOS 7 als Apache ...

Detaillierte Erklärung der integrierten Methoden des Javascript-Arrays

Inhaltsverzeichnis 1. Array.at() 2. Array.copyWit...

HTML-Code für Multiheader-Tabellen

1. Code der Multiheader-Tabelle Code kopieren Der ...

Leitfaden zum Schreiben von HTML-Code

Gängige Konventions-Tags Selbstschließende Tags, ...

Detaillierte Erklärung der Sperrstruktur in MySQL

Mysql unterstützt 3 Arten von Sperrstrukturen Spe...

Die Bedeutung des Statuscodes im HTTP-Protokoll

Ein Statuscode, der eine vorläufige Antwort anzei...

impress.js Präsentationsschicht-Framework (Demonstrationstool) - erste Erfahrungen

Ich habe ein halbes Jahr lang nicht gebloggt, wofü...

Eine kurze Zusammenfassung meiner Erfahrungen beim Schreiben von HTML-Seiten

Es sind drei oder vier Monate vergangen, seit ich ...