Bezüglich einiger MySQL-Spezifikationen haben manche Unternehmen in ihren Spezifikationen zur Tabellenerstellung die Anforderung, dass keines der Felder leer sein darf, was bedeutet, dass ein Standardwert gespeichert wird, wenn kein Wert vorhanden ist. Eigentlich sollte man sagen, dass alle Felder absolut nicht leer sind. Man sollte sagen, dass sie so nicht leer wie möglich sind. In manchen Fällen ist es unmöglich, einen Standardwert anzugeben. 1. Speicherbasierte Überlegungen Die Speicheranalyse erfordert hier ein klares Verständnis des Speicherformats von MySQL-Datenzeilen. Hier können wir einige Schlussfolgerungen direkt aus diesem Artikel übernehmen, der eine sehr klare Analyse liefert (tatsächlich bezieht er sich auch auf „MySQL Technical Content Innodb Storage Engine“). 1. Bei Feldern mit variabler Länge gilt: Wenn der zugehörige Feldwert NULL ist, belegt das zugehörige Feld keinen Speicherplatz. NULL-Werte werden nicht gespeichert und beanspruchen keinen Platz, erfordern aber ein Flag-Bit (eines pro Zeile). Im Hinblick auf die beiden Fälle von Nullwert und Nichtleerwert (nicht Null-Standardwert) gilt: Wenn der in einem Feld gespeicherte Inhalt leer ist, also nichts vorhanden ist, wird ersterer als Nullwert und letzterer als leere Zeichenfolge gespeichert. Die Speicherplatzgröße des Feldinhalts selbst ist dieselbe. Testdemo Erstellen Sie direkt eine Tabelle mit derselben Struktur, aber ein Tabellenfeld ist nicht null und das andere Tabellenfeld ist null. Verwenden Sie dann diese gespeicherte Prozedur, um Daten gleichzeitig mit einem Verhältnis von 1:10 zwischen Nullwerten und Nicht-Nullwerten in die beiden Tabellen zu schreiben. Das heißt, es werden 6 Millionen Datenzeilen geschrieben, wobei für jeweils 10 Datenzeilen eine Datenfeldzeile null ist. CREATE TABLE eine ( id INT AUTO_INCREMENT, c2 VARCHAR(50) NICHT NULL STANDARD '', c3 VARCHAR(50) NICHT NULL STANDARD '', PRIMÄRSCHLÜSSEL (id) ); Tabelle erstellen b ( id INT AUTO_INCREMENT, c2 VARCHAR(50), c3 VARCHAR(50), PRIMÄRSCHLÜSSEL (id) ); CREATE DEFINER=`root`@`%` VERFAHREN `create_test_data`( IN `loop_cnt` INT ) SPRACHE SQL NICHT DETERMINISTISCH ENTHÄLT SQL SQL-SICHERHEITSDEFINIERER KOMMENTAR '' BEGINNEN DECLARE v2, v3 VARCHAR(36); TRANSAKTION STARTEN; während loop_cnt>0 mache SET v2 = UUID(); SET v3 = UUID(); wenn (loop_cnt MOD 10) = 0 dann EINFÜGEN IN a (c2,c3) WERTE(STANDARD,STANDARD); EINFÜGEN IN b (c2,c3) WERTE(STANDARD,STANDARD); anders EINFÜGEN IN a (c2,c3) WERTE (v2,v3); EINFÜGEN IN b (c2,c3) WERTE (v2,v3); ENDE wenn; SETZEN Sie loop_cnt=loop_cnt-1; ENDE während; BEGEHEN; Die Tabellen a und b liefern genau dieselben Daten. Überprüfen Sie den belegten Speicherplatz und fragen Sie die Speicherinformationen der beiden Tabellen aus information_schema.TABLES ab. 1. Der Unterschied von einem Byte spiegelt sich in avg_row_length wider. Da alle Felder in Tabelle a nicht null sind, spart jede Zeile im Vergleich zu Tabelle b ein Byte Speicherplatz. Wenn Sie mir in Bezug auf den Speicherplatz sagen, dass Ihnen 1 GB Speicherplatz für eine 1T-Datenbank wichtig ist, sind jeglicher Daten-/Indexfragmentierungsspeicher, ein wenig reservierter Speicherplatz, Speicherplatz für Junk-Dateien, nutzloser Indexspeicherplatz usw. weitaus größer als der zusätzliche Unterschied, der durch die Nullbarkeit entsteht. 2. Effizienz beim Hinzufügen, Löschen, Prüfen und Ändern Vergleichen Sie die Lese- und Schreibvorgänge durch kontinuierliches Lesen und Schreiben von Daten innerhalb eines Bereichs, um die Lesebedingungen der Tabellen a und b zu vergleichen. Der Unterschied zwischen Hinzufügen, Löschen, Prüfen und Ändern ist ähnlich dem Unterschied beim Speicherplatz oder sogar noch kleiner, da sich eine einzelne Zeile um 1 Byte unterscheidet und ein Unterschied von 5 MB nur bei einer Vergrößerung auf 600 W+ sichtbar wird. Beim Hinzufügen, Löschen, Prüfen und Ändern wurde nach verschiedenen Tests kein offensichtlicher Unterschied festgestellt. #!/usr/bin/env python3 pymysql importieren Importzeit mysql_conn_conf = {'Host': '127.0.0.1', 'Port': 3306, 'Benutzer': 'root', 'Passwort': '******', 'db': 'db01'} def mysql_read(Tabellenname): conn = pymysql.connect(Host=mysql_conn_conf['Host'], Port=mysql_conn_conf['Port'], Datenbank=mysql_conn_conf['DB'], Benutzer=mysql_conn_conf['Benutzer'], Passwort = mysql_conn_conf['Passwort']) Cursor = conn.cursor() versuchen: cursor.execute(''' wähle id,c2,c3 aus {0}, wobei id>3888888 und id<3889999;'''.format(Tabellenname)) Zeile = Cursor.fetchall() außer pymysql.Fehler als e: drucken("mysql-Ausführungsfehler:", e) cursor.schließen() conn.close() def mysql_write(Schleife,Tabellenname): conn = pymysql.connect(Host=mysql_conn_conf['Host'], Port=mysql_conn_conf['Port'], Datenbank=mysql_conn_conf['DB'], Benutzer=mysql_conn_conf['Benutzer'], Passwort = mysql_conn_conf['Passwort']) Cursor = conn.cursor() versuchen: wenn Schleife%10 == 0: cursor.execute(''' einfügen in {0}} (c2,c3) Werte(DEFAULT,DEFAULT)'''.format(Tabellenname)) anders: cursor.execute(''' einfügen in {1}} (c2,c3) Werte(uuid(),uuid())'''.format(Tabellenname)) außer pymysql.Fehler als e: drucken("mysql-Ausführungsfehler:", e) cursor.schließen() conn.commit() conn.close() wenn __name__ == '__main__': Zeit_Start = Zeit.Zeit() Schleife = 10 while-Schleife>0: mysql_write(Schleife) Schleife = Schleife - 1 Zeit_Ende = Zeit.Zeit() Zeit_c = Zeit_Ende - Zeit_Start drucken('Zeitaufwand', time_c, 's') 3. Semantische Analyse und logische Überlegungen zu verwandten Feldern Zu diesem Punkt gibt es zu viele Meinungsverschiedenheiten und er ist auch der Punkt, der am ehesten Anlass zu Klatsch und Streit gibt. 1. Bei Zeichentypen bedeutet NULL Nichtexistenz und '' bedeutet leer. Nichtexistenz und leer sind nicht dasselbe. Ich bin nicht damit einverstanden, dass wir NOT NULL verwenden und einen Standardwert angeben müssen. Meine persönliche Meinung ist ganz klar. Sofern keine spezielle Anforderung besteht, dass ein Feld keinen NULL-Wert haben darf, ist NULL unter normalen Umständen NULL. Mir ist eine interessante Sache zu den Standardwerten eingefallen. Als ich mir ein Video auf Bilibili ansah, erwähnte ein bestimmter Uploader, dass der Uploader nach der Analyse der Klicks des Benutzers unverständliche Daten erhalten habe, weil Bilibili die registrierten Benutzer standardmäßig als männlich und das Geburtsdatum als ein bestimmtes Datum einstellte. Mein persönliches Wissen ist begrenzt, aber die Daten sind ehrlich. Ich möchte wirklich wissen, welche anderen positiven Effekte „alle Felder sind nicht null“ mit sich bringt und wie man diesen positiven Faktor misst. Und haben Sie das wirklich getan? Können Sie verhindern, dass die Felder in allen Datenbanktabellen der gesamten Instanz null sein können? Dies ist das Ende dieses Artikels über die detaillierte Verwendung von null und nicht null beim Erstellen von Tabellen in MySQL. Weitere relevante Inhalte zu null und nicht null beim Erstellen von Tabellen in MySQL 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:
|
<<: Detaillierte Erklärung zu Drag-Time und Drag-Case in JavaScript
>>: Skript zum schnellen Auflisten aller Hostnamen (Computernamen) im LAN unter Linux
Einführung: Lambda Probe (früher bekannt als Tomc...
Inhaltsverzeichnis Vorwort Einführung in QueryCac...
Git ist in vscode integriert und viele Vorgänge k...
Ein Kollege fragte mich, was N und M im MySQL-Dat...
Inhaltsverzeichnis 1. JDK installieren Manuelle I...
Teil 1 Übersicht über die SSH-Portweiterleitung H...
Schauen wir uns zunächst den GIF-Vorgang an: Fall...
Nachdem Sie den folgenden Artikel gelesen haben, ...
Der MySQL-Volltextindex ist ein spezieller Index,...
In diesem Artikelbeispiel wird der spezifische Co...
Vorwort Unabhängig davon, ob es sich um eine eige...
1. Hot Deployment: Das bedeutet, das gesamte Proj...
Manchmal erstellen wir einen Dateiserver über ngi...
In diesem Artikelbeispiel wird der spezifische Co...
Als ich heute VMware verwendete, um eine neue vir...