Analyse der Gründe, warum MySQL-Felddefinitionen nicht null verwenden sollten

Analyse der Gründe, warum MySQL-Felddefinitionen nicht null verwenden sollten

Warum wird NULL so oft verwendet?

(1) Javas Null

Null ist ein Problem, wie z. B. NullPointerException in Java. Um unerwartete Nullzeiger zu vermeiden, müssen Sie verschiedene if-Beurteilungen sorgfältig vornehmen, was mühsam und aufwändig ist.

Aus diesem Grund gibt es viele Open-Source-Pakete, die viele Verarbeitungs

allgemeine lang3s StringUtils.isBlank(); CollectionUtils.isEmpty();

Guaven optional

Sogar Java 8 hat Optional eingeführt, um dieses Problem zu vermeiden (ähnlich wie Guava, mit leicht anderer Verwendung).

(2) Warum wird MySQLs Null so häufig missbraucht?

(a) Das Erstellen von nicht standardmäßigen Nullen ist die Standardeinstellung beim Erstellen einer Datentabelle. Einige MySQL-Clients geben in ihren automatisch generierten Tabellenanweisungen möglicherweise nicht „not null“ an.

(b) Manche Leute denken vielleicht, dass nicht null mehr Platz benötigt.

(c) Um Probleme zu vermeiden, müssen beim Einfügen von Daten während der Entwicklung keine Nullwerte beurteilt werden, was das Schreiben von SQL erleichtert

2. Offizielle Dokumente

NULL-Spalten benötigen zusätzlichen Platz in der Zeile, um aufzuzeichnen, ob ihre Werte NULL sind. Bei MyISAM-Tabellen benötigt jede NULL-Spalte ein zusätzliches Bit, aufgerundet auf das nächste Byte.

MySQL hat Schwierigkeiten bei der Optimierung von Abfragen, die auf nullbare Spalten verweisen, was Indizes, Indexstatistiken und Werte komplexer macht. Nullable-Spalten benötigen mehr Speicherplatz und erfordern eine spezielle Verarbeitung in MySQL. Nachdem die nullfähige Spalte indiziert wurde, benötigt jeder Datensatz ein zusätzliches Byte und kann auch dazu führen, dass der Index mit fester Größe in MYISAM zu einem Index mit variabler Größe wird. —— Aus „High Performance MySQL Second Edition“

Es scheint, dass es keinen Leistungsvorteil bringt, wenn man nicht „not null“ angibt.

Drei Gründe, warum MySQL kein Null verwendet

(1) Alle Situationen, in denen NULL-Werte verwendet werden, können durch einen aussagekräftigen Wert dargestellt werden, was der Lesbarkeit und Wartbarkeit des Codes förderlich ist und die Standardisierung von Geschäftsdaten aus Sicht der Einschränkungen verbessern kann.

(2) Aktualisierungen von NULL-Werten auf Nicht-NULL-Werte können nicht direkt vor Ort durchgeführt werden, wodurch die Wahrscheinlichkeit einer Indexaufteilung erhöht wird und somit die Leistung beeinträchtigt wird. (Die Leistungsverbesserung von null -> nicht null ist sehr gering. Betrachten Sie es daher nicht als vorrangige Optimierungsmaßnahme, es sei denn, Sie sind sicher, dass es Probleme verursacht.)

(3) NULL-Werte sind anfällig für Probleme im Zeitstempeltyp, insbesondere wenn der Parameter explicit_defaults_for_timestamp nicht aktiviert ist.

(4) Abfragen mit negativen Bedingungen, wie etwa NOT IN und !=, liefern bei einem NULL-Wert immer leere Ergebnisse, was die Abfrage fehleranfällig macht.

Vier schlimme Fälle durch Null

Dateninitialisierung:

Tabelle erstellen table1 (
    `id` INT (11) NICHT NULL,
    `name` varchar(20) NICHT NULL
)


Tabelle erstellen table2 (
    `id` INT (11) NICHT NULL,
    `Name` varchar(20)
)

in Tabelle1 Werte einfügen (4,"zhaoyun"),(2,"zhangfei"),(3,"liubei")
in Tabelle2 Werte einfügen (1,"zhaoyun"),(2, null)

(1) Eine NOT IN-Unterabfrage gibt bei einem NULL-Wert immer ein leeres Ergebnis zurück und die Abfrage ist fehleranfällig.

Wählen Sie den Namen aus Tabelle1, wo der Name nicht drin ist (wählen Sie den Namen aus Tabelle2, wo ID!=1)

+-------------+
| Name |
|-------------|
+-------------+

(2) Spaltenwerte dürfen leer sein, der Index speichert keine Nullwerte und diese Datensätze sind nicht im Ergebnissatz enthalten.

Wählen Sie * aus Tabelle2, wobei Name != 'zhaoyun'

+------+----------+
| Ich würde | Name |
|------+----------|
| | |
+------+----------+

Wählen Sie * aus Tabelle2, wobei Name != 'zhaoyun1'

+------+----------+
| Ich würde | Name |
|------+----------|
| 1 | simon_simon |
+------+----------+

(3) Wenn Sie concat verwenden, müssen Sie zunächst prüfen, ob die einzelnen Felder ungleich null sind. Andernfalls ist das verkettete Ergebnis null, wenn ein beliebiges Feld leer ist.

wähle concat("1", null) aus dual;

+--------------------+
| concat("1", null)|
|--------------------|
| NULL |
+--------------------+

(4) Bei der Berechnung der Anzahl werden Nullspalten nicht in die Statistik einbezogen.

Wählen Sie Anzahl(Name) aus Tabelle2;

+--------------------+
| Anzahl(Benutzername) |
|--------------------|
| 1 |
+--------------------+

Vergleich von fünf Indexlängen

Tabelle ändern, Tabelle1, Index hinzufügen, idx_name (Name);
Tabelle ändern, Tabelle2, Index idx_name (Name) hinzufügen;
Erläutern Sie „select * from table1 where name='zhaoyun';“
Erläutern Sie „Select * from table2“, wobei Name = „zhaoyun“ ist.

key_len von Tabelle1 = 82

key_len von Tabelle2 = 83

Die Berechnungsregeln von key_len hängen von drei Faktoren ab: Datentyp, Zeichenkodierung und ob es NULL ist

key_len 82 = 20 * 4 (utf8mb4 – 4 Bytes, utf8 – 3 Bytes) + 2 (die Länge zum Speichern von Varchar-Zeichen mit variabler Länge beträgt 2 Bytes, und Felder mit fester Länge erfordern keine zusätzlichen Bytes)

key_len 83 = 20 * 4 (utf8mb4 – 4 Bytes, utf8 – 3 Bytes) + 2 (varchar-Zeichen mit variabler Länge werden in 2 Bytes gespeichert, Felder mit fester Länge erfordern keine zusätzlichen Bytes) + 1 (Null-Flag)

Daher ist es am besten, das Indexfeld nicht auf NULL zu setzen, da NULL den Index, die Indexstatistiken und die Werte komplizierter macht und ein zusätzliches Byte Speicherplatz erfordert.

Dies ist das Ende dieses Artikels darüber, wie man Null in MySQL-Felddefinitionen vermeidet. Weitere Informationen zu Null in MySQL-Felddefinitionen 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:
  • Warum sollten MySQL-Felder NOT NULL verwenden?
  • Sollten nullbare Felder in MySQL auf NULL oder NOT NULL gesetzt werden?
  • mysql löst das Problem, Datensätze zu finden, bei denen zwei oder mehr Felder NULL sind
  • MySQL-Abfrage für leere oder nicht leere Felder (ist null und nicht null)

<<:  Diskussion zum Problem der Initialisierung von Iframe-Knoten

>>:  Implementierungsschritte zum Erstellen eines FastDFS-Dateiservers unter Linux

Artikel empfehlen

Zusammenfassung der wichtigsten Docker-Befehle für Entwickler

Inhaltsverzeichnis Einführung in Docker Installat...

Eine kurze Einführung in Linux-Umgebungsvariablendateien

Im Linux-System können Umgebungsvariablen entspre...

Zusammenfassung des Wissens zum Vue V-Modell

​v-model ist eine Vue-Direktive, die eine bidirek...

So beheben Sie den Startfehler des Docker-Containers

Frage: Nach dem Neustart des Computers kann der M...

Die v-for-Direktive in Vue vervollständigt die Listendarstellung

Inhaltsverzeichnis 1. Listendurchlauf 2. Die Roll...

Optimierung der Web-Frontend-Leistung

Best Practices für die Web-Frontend-Optimierung: ...

So implementieren Sie Polygonbrechung in Echtzeit mit Threejs

Inhaltsverzeichnis Vorwort Schritt 1: Aufbau und ...

Vorschau auf die neuen Funktionen von XHTML 2.0

<br />Bevor Browser die nächste Generation v...

Docker-Einstellung für den Windows-Speicherpfadvorgang

Wenn Sie Docker unter Windows 10 installieren und...

MySQL verwendet inet_aton und inet_ntoa, um IP-Adressdaten zu verarbeiten

Dieser Artikel stellt vor, wie Sie IP-Adressdaten...

MySQL 8.0.15 Installations- und Konfigurations-Tutorial unter Win10

Was ich kürzlich gelernt habe, beinhaltet Kenntni...