In letzter Zeit waren viele datenbankbezogene Vorgänge erforderlich, und die vorhandenen Spezifikationen des Unternehmens sind nicht sehr umfassend. Basierend auf den relevanten Spezifikationen verschiedener Experten im Internet habe ich einige Standardverwendungen für meinen eigenen Gebrauch zusammengestellt. Ich hoffe, Sie können mich korrigieren. Datenbankumgebung dev: Entwicklungsumgebung Entwickler können die Tabellenstruktur lesen, schreiben und ändern. Entwickler können die Tabellenstruktur und die darin enthaltenen Daten nach Belieben ändern, müssen jedoch sicherstellen, dass dadurch keine Auswirkungen auf andere Entwicklungskollegen auftreten. test: Testumgebung Die Entwicklung kann lesen und schreiben und Entwickler können die Tabellenstruktur mithilfe von Tools ändern. online: Online-Umgebung Entwickler dürfen keine Datenbankoperationen direkt in der Online-Umgebung durchführen. Wenn Operationen erforderlich sind, müssen sie einen DBA finden, der die Operationen durchführt und entsprechende Aufzeichnungen macht. Stresstests sind verboten. Der entscheidende Punkt besteht darin, dass die den MySQL-Servern in jeder Umgebung entsprechenden Benutzerberechtigungen klar aufgeteilt und erkennbar sein müssen und eine spezifische Unterscheidung zwischen Geschäftsszenarien ermöglichen müssen. Namenskonventionen Grundlegende Benennungsregeln
Warum sind alle Bibliotheken, Tabellen und Felder kleingeschrieben? In MySQL entsprechen Datenbanken und Tabellen Verzeichnissen und Dateien innerhalb dieser Verzeichnisse. Daher bestimmt die Sensibilität des Betriebssystems die Groß- und Kleinschreibung von Datenbank- und Tabellennamen.
Tabellenbenennung Tabellen im selben Modul sollten möglichst dasselbe Präfix verwenden und die Tabellennamen sollten so aussagekräftig wie möglich sein. Alle Protokolltabellen beginnen mit log_ Feldbenennung
Indexbenennung
Benennung von Einschränkungen
Spezifikationen für das Tabellendesign Die Tabellen-Engine hängt vom tatsächlichen Anwendungsszenario ab. MyISAM wird für Protokoll- und Berichtstabellen empfohlen, und InnoDB wird für Tabellen empfohlen, die sich auf Transaktionen, Audits und Beträge beziehen. Sofern nicht anders angegeben, wird beim Erstellen der Tabellen die InnoDB-Engine verwendet. Der Standardzeichensatz ist utf8mb4 und die Datenbanksortierregel ist utf8mb4_general_ci. (Da die Datenbankdefinition den Standard verwendet, kann die Datentabelle neu definiert werden. Aus Sicherheitsgründen wird jedoch empfohlen, Folgendes zu schreiben: Warum wählt der Zeichensatz nicht utf8 und die Sortierung verwendet nicht utf8_general_ci? MySQL mit UTF-8-Kodierung kann keine Emoji-Ausdrücke speichern, die 4 Bytes als Platzhalter verwenden. Damit das Backend-Projekt vom Client eingegebene Emoji-Ausdrücke vollständig unterstützt, ist ein Upgrade der Kodierung auf utf8mb4 die beste Lösung. Wenn die Zeichenkodierung der JDBC-Verbindungszeichenfolge auf utf8 eingestellt ist oder die Emoji-Daten nach der obigen Konfiguration nicht normal eingefügt werden können, müssen Sie im Code den Zeichensatz der Verbindung als utf8mb4 angeben. Alle Tabellen und Felder sollten das Kommentarspaltenattribut verwenden, um die wahre Bedeutung der Tabelle oder des Felds zu beschreiben. Wenn es sich um einen Aufzählungswert handelt, wird empfohlen, den im Feld verwendeten Inhalt zu definieren. Sofern nicht anders angegeben, muss das erste ID-Feld in der Tabelle der Primärschlüssel sein und automatisch hochzählen. Es ist verboten, es als Kontext oder Bedingung für die Datenübertragung außerhalb einer Transaktion zu verwenden. Verwenden Sie varchar nicht als Primärschlüssel-Anweisungsentwurf. Sofern nicht anders angegeben, muss die Tabelle die Felder „create_time“ und „modify_time“ enthalten, d. h. die Tabelle muss Felder enthalten, die den Erstellungszeitpunkt und den Änderungszeitpunkt aufzeichnen. Sofern nicht anders angegeben, muss die Tabelle is_del enthalten, um anzuzeigen, ob die Daten gelöscht wurden. Das physische Löschen von Datenbankdaten ist grundsätzlich nicht zulässig.
Was ist der Unterschied zwischen Datum und Uhrzeit und Zeitstempel? Ähnlichkeiten: Das Anzeigeformat einer TIMESTAMP-Spalte ist dasselbe wie das einer DATETIME-Spalte. Die Anzeigebreite ist auf 19 Zeichen festgelegt und das Format ist JJJJ-MM-TT HH:MM:SS. Unterschiede: ZEITSTEMPEL
Wie verwende ich die automatische Zuweisungseigenschaft von TIMESTAMP? Verwenden Sie die aktuelle Zeit als Standardwert für ts: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP. Wenn eine Zeile aktualisiert wird, aktualisieren Sie den Wert von ts: ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP. Sie können 1 und 2 kombinieren: ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Wie verwende ich INT UNSIGNED zum Speichern von IPs? Verwenden Sie INT UNSIGNED statt char(15), um IPv4-Adressen zu speichern, und konvertieren Sie sie mit den MySQL-Funktionen inet_ntoa und inet_aton. Für IPv6-Adressen gibt es derzeit keine Konvertierungsfunktion und sie müssen mit DECIMAL oder zwei bigINTs gespeichert werden.
INT[M], was stellt der M-Wert dar? Beachten Sie, dass die Zahl nach der Klammer des numerischen Typs lediglich die Breite angibt und nichts mit dem Speicherbereich zu tun hat. Viele Leute denken, dass die Wertebereiche von INT(4) und INT(10) (-9999 bis 9999) bzw. (-9999999999 bis 99999999999) betragen. Das ist ein Irrtum. Tatsächlich können die Spaltenwerte gleich breit gemacht werden, wenn der M-Wert im Integer-Typ in Kombination mit dem ZEROFILL-Attribut verwendet wird. Unabhängig vom Wert von M in INT[M] beträgt sein Wertebereich (-2147483648 bis 2147483647 bei Vorzeichen), (0 bis 4294967295 bei Vorzeichenlosigkeit). Die Anzeigebreite schränkt weder den Wertebereich ein, der in der Spalte enthalten sein kann, noch schränkt sie die Anzeige von Werten ein, die die angegebene Breite der Spalte überschreiten. Bei Verwendung in Verbindung mit dem optionalen erweiterten Attribut ZEROFILL werden zusätzliche Leerzeichen standardmäßig durch Nullen ersetzt. Beispielsweise wird für eine als INT(5) ZEROFILL deklarierte Spalte der Wert 4 als 00004 abgerufen. Beachten Sie, dass Sie beim Speichern eines Wertes, der die Anzeigebreite in einer Integer-Spalte überschreitet, möglicherweise auf Probleme stoßen, wenn MySQL temporäre Tabellen für komplexe Joins generiert, da MySQL in diesen Fällen davon ausgeht, dass die Daten in die ursprüngliche Spaltenbreite passen. Wenn Sie ZEROFILL für eine numerische Spalte angeben, fügt MySQL der Spalte automatisch das Attribut UNSIGNED hinzu. Verwenden von VARBINARY zum Speichern von Zeichenfolgen mit variabler Länge und unter Berücksichtigung der Groß-/Kleinschreibung Wann sollte CHAR und wann VARCHAR verwendet werden? Die Typen CHAR und VARCHAR sind ähnlich, werden aber unterschiedlich gespeichert und abgerufen. Sie unterscheiden sich außerdem hinsichtlich der maximalen Länge und ob nachstehende Leerzeichen beibehalten werden. Die für die Typen CHAR und VARCHAR angegebene Länge gibt die maximale Anzahl der Zeichen an, die Sie speichern möchten. Beispielsweise kann CHAR(30) 30 Zeichen umfassen. Die Länge einer CHAR-Spalte ist auf die Länge festgelegt, die beim Erstellen der Tabelle deklariert wird. Die Länge kann jeden Wert zwischen 0 und 255 haben. Beim Speichern von CHAR-Werten werden diese rechts mit Leerzeichen auf die angegebene Länge aufgefüllt. Beim Abrufen von CHAR-Werten werden nachstehende Leerzeichen entfernt. Es erfolgt keine Fallkonvertierung während der Speicherung oder Abfrage. Die Werte in einer VARCHAR-Spalte sind Zeichenfolgen mit variabler Länge. Die Länge kann als Wert von 0 bis 65.535 angegeben werden. (Die maximale effektive Länge eines VARCHAR wird durch die maximale Zeilengröße und den verwendeten Zeichensatz bestimmt. Die maximale Gesamtlänge beträgt 65.532 Bytes.) Im Gegensatz zu CHAR werden VARCHAR-Werte nur mit der erforderlichen Anzahl von Zeichen plus einem zusätzlichen Byte zum Aufzeichnen der Länge gespeichert (zwei Bytes werden verwendet, wenn die deklarierte Länge der Spalte 255 überschreitet). VARCHAR-Werte werden ohne Auffüllung gespeichert. Nachfolgende Leerzeichen bleiben beim Speichern und Abrufen von Werten gemäß Standard-SQL erhalten. char eignet sich zum Speichern des MD5-Hashes des Benutzerkennworts und seine Länge ist immer gleich. Bei Werten, die sich häufig ändern, ist char auch besser als varchar, da Zeilen mit fester Länge weniger wahrscheinlich fragmentiert werden. Bei sehr kurzen Spalten ist char auch effizienter als varchar. Eine char(1)-Zeichenfolge belegt bei einem Einzelbyte-Zeichensatz nur ein Byte, eine varchar(1)-Zeichenfolge belegt jedoch zwei Bytes, da ein Byte zum Speichern der Längeninformationen verwendet wird. Spezifikationen für den Indexentwurf Die MySQL-Abfragegeschwindigkeit hängt von einem guten Indexdesign ab. Daher sind Indizes für eine hohe Leistung von entscheidender Bedeutung. Ein angemessener Index beschleunigt die Abfrage (einschließlich der Geschwindigkeit von UPDATE und DELETE. MySQL lädt die Seite mit der Zeile in den Speicher und führt dann den UPDATE- oder DELETE-Vorgang aus). Ein unangemessener Index verlangsamt die Abfrage. Die MySQL-Indexsuche ähnelt der Pinyin- und Radikalsuche des Xinhua-Wörterbuchs. Wenn die Pinyin- und Radikalindizes nicht vorhanden sind, können sie nur durch Umblättern der Seiten nacheinander durchsucht werden. Wenn eine MySQL-Abfrage einen Index nicht verwenden kann, führt MySQL einen vollständigen Tabellenscan durch, der viele IO verbraucht. Der Zweck des Index: Deduplizierung, beschleunigte Positionierung, Vermeidung von Sortierung, Abdeckung des Index. Was ist ein Deckungsindex? In der InnoDB-Speicher-Engine speichert der Sekundärindex (Nicht-Primärschlüsselindex) die Zeilenadresse nicht direkt, sondern den Primärschlüsselwert. Wenn der Benutzer eine Datenspalte abfragen muss, die nicht im Sekundärindex enthalten ist, muss er zuerst den Primärschlüsselwert über den Sekundärindex finden und dann andere Datenspalten über den Primärschlüssel abfragen, sodass die Abfrage zweimal ausgeführt werden muss. Das Konzept eines abdeckenden Indexes besteht darin, dass die Abfrage in einem Index abgeschlossen werden kann. Die Effizienz eines abdeckenden Indexes ist höher, und die Primärschlüsselabfrage ist ein natürlicher abdeckender Index. Eine sinnvolle Indexerstellung und ein sinnvoller Einsatz von Abfrageanweisungen kann bei der Verwendung von abdeckenden Indizes zu einer Leistungssteigerung führen. Beispiel: SELECT email,uid FROM user_email WHERE uid=xx. Wenn uid nicht der Primärschlüssel ist, können Sie zur Leistungssteigerung einen Index als index(uid,email) hinzufügen. Grundlegende Indexspezifikationen
Warum kann eine Tabelle nicht zu viele Indizes enthalten? Der sekundäre Index von InnoDB verwendet b+tree zur Speicherung, daher muss b+tree während UPDATE, DELETE und INSERT angepasst werden. Zu viele Indizes verlangsamen den Aktualisierungsprozess. Verwenden Sie einen Präfixindex für Zeichenfolgen. Die Länge des Präfixindex sollte 8 Zeichen nicht überschreiten. Es wird empfohlen, dem Präfixindex Priorität einzuräumen. Fügen Sie bei Bedarf eine Pseudospalte hinzu und erstellen Sie einen Index. Indizieren Sie keine Blob-/Textfelder und keine großen Felder, da der Index dadurch zu viel Speicherplatz beansprucht. Was ist ein Präfixindex? Vereinfacht ausgedrückt besteht die Präfixindizierung darin, einen Index für die ersten paar Zeichen des Textes zu erstellen (die genaue Anzahl der Zeichen wird beim Erstellen des Index angegeben). Dadurch wird ein kleinerer Index erstellt, sodass Abfragen schneller sind. Durch den Präfixindex kann die Größe von Indexdateien effektiv reduziert und die Indizierungsgeschwindigkeit verbessert werden. Präfixindizes haben jedoch auch ihre Nachteile: MySQL kann Präfixindizes weder in ORDER BY noch in GROUP BY verwenden, noch können sie als überlagernde Indizes verwendet werden. Die Syntax zum Erstellen eines Präfixindex lautet: ALTER TABLE table_name ADD KEY(column_name(prefix_length)); Primärschlüsselkriterien
Wichtiges SQL muss indiziert werden, und Kern-SQL sollte beim Abdecken von Indizes Vorrang erhalten.
Das herausragendste Feld steht an erster Stelle
Index Tabus
Einschränkungen von Indizes in MySQL Die Gesamtlänge des MYISAM-Speicher-Engine-Index darf 1000 Byte nicht überschreiten Aussagekräftige Designvorgaben Verwenden vorbereiteter Anweisungen
Vermeiden impliziter Konvertierungen Dies führt dazu, dass der Index fehlschlägt Nutzen Sie Präfixindizes
Verwenden Sie keine negativen Abfragen, wie z. B. „nicht in/wie“
Vermeiden Sie die Verwendung gespeicherter Prozeduren, Trigger, UDFs, Ereignisse usw.
Vermeiden Sie JOINs bei großen Tabellen MySQL eignet sich am besten für Primärschlüssel-/Sekundärindexabfragen für einzelne Tabellen. Vermeiden Sie Berechnungen in der Datenbank
Reduzieren Sie die Anzahl der Interaktionen mit der Datenbank
Paging angemessen nutzen Begrenzen Sie die Anzahl der in der Seitennummerierung angezeigten Seiten. Nur die vorherige und die nächste Seite können angeklickt werden. Es wird eine verzögerte Zuordnung verwendet. Wie verwendet man Paging richtig? Angenommen, es gibt eine Paging-Anweisung wie die folgende: SELECT * FROM table ORDER BY id LIMIT 10000, 10. MySQL behandelt LIMIT OFFSET so, dass alle Daten von OFFSET+LIMIT abgerufen werden, dann OFFSET entfernt wird und das untere LIMIT zurückgegeben wird. Wenn der OFFSET-Wert groß ist, ist die Abfrageleistung von MySQL daher sehr niedrig. Dies kann durch die Verwendung von id > n gelöst werden: Die Methode, ID > n zu verwenden, hat Einschränkungen. Das Problem diskontinuierlicher IDs kann gelöst werden, indem beim Umblättern gleichzeitig die letzte ID übergeben wird. http://example.com/page.php?last=100 Wähle * aus Tabelle, in der ID <100, Sortierung nach ID, Abstiegsgrenze 10 //Vorherige Seite http://example.com/page.php?first=110 Wählen Sie * aus der Tabelle, in der die ID>110 ist. Sortieren nach ID, Abstiegslimit 10 Der größte Nachteil dieser Methode besteht darin, dass die Seite nicht aktualisiert wird, wenn während des Durchsuchens ein Einfüge-/Löschvorgang stattfindet, und die Gesamtzahl der Seiten möglicherweise immer noch auf Grundlage der neuen Anzahl (*) berechnet wird, was letztendlich dazu führen kann, dass auf einige Datensätze nicht mehr zugegriffen werden kann. Um dieses Problem zu beheben, können Sie weiterhin die aktuelle Seitenzahl eingeben und prüfen, ob es Vorgänge wie Einfügen/Löschen gab, die sich auf die Gesamtzahl der Datensätze seit dem letzten Seitenumblättern auswirken, und diese zwischenspeichern. Wählen Sie * aus der Tabelle, wobei ID >= (Wählen Sie ID aus der Tabelle, sortiert nach ID-Limit #offset#, 1)
Die EXPLAIN-Anweisung (ausgeführt im MySQL-Client) kann Informationen darüber erhalten, wie MySQL SELECT-Anweisungen ausführt. Durch Ausführen von EXPLAIN für die SELECT-Anweisung können Sie feststellen, ob MySQL beim Ausführen der SELECT-Anweisung Indizes, vollständige Tabellenscans, temporäre Tabellen, Sortierungen und andere Informationen verwendet. Versuchen Sie, MySQL zu vermeiden, vollständige Tabellenscans durchzuführen, temporäre Tabellen zu verwenden, zu sortieren usw. Weitere Einzelheiten finden Sie in der offiziellen Dokumentation. Verwenden Sie union all anstelle von union Was ist der Unterschied zwischen „Union All“ und „Union“? Die Schlüsselwörter „union“ und „union all“ führen beide zwei Ergebnismengen zu einer zusammen, unterscheiden sich jedoch hinsichtlich Verwendung und Effizienz. Nachdem die Union-Tabelle verknüpft wurde, werden die doppelten Datensätze herausgefiltert. Nachdem die Tabelle verknüpft wurde, wird der resultierende Ergebnissatz sortiert, die doppelten Datensätze werden gelöscht und anschließend das Ergebnis zurückgegeben. wie: wähle * aus test_union1 Union-Auswahl * aus test_union2 Wenn dieses SQL ausgeführt wird, ruft es zuerst die Ergebnisse der beiden Tabellen ab, verwendet dann den Sortierbereich zum Sortieren und Löschen doppelter Datensätze und gibt schließlich den Ergebnissatz zurück. Wenn die Datenmenge in der Tabelle groß ist, kann dies zu einer Datenträgersortierung führen. Union all führt einfach die beiden Ergebnisse zusammen und gibt sie zurück. Wenn in den beiden zurückgegebenen Ergebnissätzen doppelte Daten vorhanden sind, enthält der zurückgegebene Ergebnissatz auf diese Weise die doppelten Daten. In Bezug auf die Effizienz ist „union all“ viel schneller als „union“. Wenn Sie also bestätigen können, dass die beiden zusammengeführten Ergebnismengen keine doppelten Daten enthalten, verwenden Sie „union all“ wie folgt: wähle * aus test_union1 Vereinigung alles wähle * aus test_union2
Tabellenspezifikationen Wenn das Datenvolumen einer einzelnen Tabelle 5 Millionen übersteigt oder die Datenkapazität innerhalb von ein bis zwei Jahren 10 G übersteigt, sollten Sie eine Aufteilung der Tabelle in Betracht ziehen. Dabei ist es notwendig, die Migration historischer Daten oder die Selbstlöschung historischer Daten durch die Anwendung im Voraus in Betracht zu ziehen. Sie können eine gleichmäßige und ausgewogene Aufteilung oder eine Aufteilung gemäß den Geschäftsregeln verwenden. Die aufzuteilenden Datentabellen müssen die Aufteilungsstrategie mit dem DBA besprechen
Verhaltenskodex
Andere Spezifikationen Es wird nicht empfohlen, Protokolldaten auf MySQL zu speichern. Hbase oder OceanBase sollten Vorrang erhalten. Wenn Speicher erforderlich ist, bitten Sie den DBA, die Verwendung komprimierter Tabellen zur Speicherung zu prüfen. Oben sind die Details der äußerst detaillierten MySQL-Nutzungsspezifikationen aufgeführt. Weitere Informationen zu MySQL-Nutzungsspezifikationen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: OpenLayers realisiert die Methode zur aggregierten Anzeige von Punkt-Feature-Layern
>>: Verwendung des Linux-Befehls xargs
In diesem Artikel wird der spezifische Code von j...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis 1. Was ist Lazy Loading von Ro...
Inhaltsverzeichnis Zuerst müssen wir das Seitenla...
1. Laden Sie das MySQL-Installationspaket herunte...
Gespeicherte Prozeduren 1. Erstellen Sie eine ges...
Hinweis: Diese Methode ist nur auf WebKit-basiert...
Seit Zabbix Version 3.0 wird verschlüsselte Kommu...
Vorwort Der Ubuntu-Server des Unternehmens platzi...
Wo liegt meine Heimatstadt, wenn ich nach Nordwes...
Inhaltsverzeichnis Thema analysieren Gebrauchsgeg...
Inhaltsverzeichnis Redis auf Docker installieren ...
Vor Kurzem musste ich den Server erneut einem Str...
MySQL 8.0.3 steht kurz vor der Veröffentlichung. ...
Ich habe das von Alibaba Cloud gekaufte CentOS fü...