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

So fragen Sie den minimal verfügbaren ID-Wert in der MySQL-Tabelle ab

Als ich mir heute die Laborprojekte ansah, stieß ...

5 Möglichkeiten zum Löschen oder Entfernen großer Dateiinhalte in Linux

Beim Arbeiten mit Dateien im Linux-Terminal möcht...

Apropos ContentType(s) von image/x-png

Dies führte auch dazu, dass PNG-Dateien nicht hoch...

JavaScript implementiert Ziehen mit der Maus, um die Div-Größe anzupassen

In diesem Artikel wird der spezifische JavaScript...

Detaillierte Erläuterung der Mybatis-Sonderzeichenverarbeitung

Vorwort: Mybatis-Sonderzeichenverarbeitung, Verar...

Axios storniert Anfragen und vermeidet doppelte Anfragen

Inhaltsverzeichnis Herkunft Status Quo Anfrage ab...

Detaillierte Erklärung des CSS3-Rotationswürfelproblems

3D-Koordinatenkonzept Wenn sich ein Element dreht...

HTML-Tipps, um Ihren Code semantisch zu gestalten

HTML-Semantik scheint ein alltägliches Problem zu...

Kurze Analyse von MySQL Union und Union All

In der Datenbank führen sowohl die Schlüsselwörte...

Einführung in ApplicationHost.config (IIS-Speicherkonfigurationsbereichsdatei)

Nehmen Sie für eine neu erstellte Website ASP.NET...