- 1. Namenskonvention
- 2. Verwenden Sie immer den richtigen Datentyp
- 3. Verwenden Sie CHAR (1) über VARCHAR (1)
- 4. CHAR für feste Daten
- 5. Vermeiden Sie die Verwendung regionaler Datumsformate
- 6. Optimiere deine Anfragen für den Cache
- 7. Vermeiden Sie die Verwendung von "SELECT *" in Ihren Abfragen
- 8. Verwenden Sie LIMIT 1, wenn Sie nur eine einzelne Zeile wünschen
- 9. Verwendung von ***** BY
- 10. Passenden Basismotor auswählen
- 11. Verwenden Sie die EXISTS-Klausel bei Bedarf
- 12. Verwenden Sie EXPLAIN in Ihren SELECT-Abfragen
- 13. Index und verwenden Sie denselben Spaltentyp für Joins
- 14. Verwenden Sie NOT NULL, wenn Sie können
- 15. Tabellen mit fester Größe (statisch) sind schneller
- 16. Vertikale Aufteilung
- 17. Speichert IP-Adressen als UNSIGNED INT
- 18. Erstellen Sie Ansichten, um die allgemeine Verwendung in Tabellen zu vereinfachen
- 19. Verwenden Sie nicht ***** BY RAND ()
- 20. Optimieren Sie die WHERE-Klausel
Die MySQL-Datenbank hat sich aufgrund ihrer hohen Leistung, Konsistenz, hohen Zuverlässigkeit und Benutzerfreundlichkeit zur beliebtesten relationalen Open-Source-Datenbank der Welt entwickelt. Diese Vorteile, die es uns bietet, werden jedoch oft von der Art und Weise beeinflusst, wie wir daran arbeiten.
In diesem Tutorial lernen Sie eine Reihe von Tipps kennen, die sehr nützlich sind und es uns ermöglichen, sowohl aus der Sicht des Programmierers als auch des Datenbankadministrators das Beste herauszuholen.
Welches Werkzeug werden wir verwenden?MySQL-Befehlskonsole '] MySQL hat ein Programm mit demselben Namen wie die Datenbank (mysql), das verwendet wird, um die Datenbank über die Befehlszeile zu verwalten.
FensterEs befindet sich in einem Verzeichnis wie:
C: \ Programme \ MySQL \ MySQL Server 5.6 \ bin
Das Verzeichnis kann variieren, es kann sich beispielsweise im Stammverzeichnis der Festplatte C: oder an einem anderen Ort befinden, an dem wir MySQL installiert haben. Um auf die MySQL-Konsole in Windows zuzugreifen, müssen wir uns in diesem Verzeichnis befinden.
LinuxSiehe folgenden Link:
Zugriff auf MySQL unter Linux
MacComputer mit System Mac OS X Sie haben das Befehlszeilenterminal in die verfügbaren Anwendungen integriert. Für den Zugriff wird der gleiche Befehl verwendet wie unter Linux.
phpMyAdminEs ist ein kostenloses, in PHP geschriebenes Software-Tool, das verwendet wird, um MySQL über das Internet zu verwalten. Wenn Sie eine lokale Entwicklungsumgebung wie XAMPP oder WAMP installiert haben, ist dieses Tool bereits installiert. Wenn Sie einen Hosting-Plan mit Administrationsbereich haben, bieten die meisten von ihnen dieses Tool als MySQL-Datenbankadministrator an.
[color = rgb (169,169,169)] phpMyAdmin von XAMPP [/color]
VERGRÖSSERN
[color = # a9a9a9] phpMyAdmin von CPanel [/color]
Wenn wir diese beiden Tools zur Hand haben, können wir damit beginnen, all diese bewährten Praktiken zu testen, die wir unten zeigen.
Diese sind Die 20 wichtigsten MySQL-Best Practices:
1. Namenskonvention
Es gibt Codierungsstandards für jede Programmiersprache, aber in MySQL-Begriffen haben wir keine universellen Codierungspraktiken gefunden, die jeder befolgt. Durch die Überprüfung mehrerer auf PHP basierender Open-Source-Frameworks filtern wir jedoch einige allgemeine Anwendungsregeln heraus, die uns helfen, SQL-Abfragen schneller zu schreiben und Verwirrung und Konflikte sowohl in der Abfrage als auch in der von uns verwendeten Programmiersprache zu beseitigen.
Allgemeine RegelnBeachten Sie die folgenden Regeln, um Probleme zu vermeiden.
- Verwenden Sie Kleinbuchstaben, da dies Ihnen bei der Tippgeschwindigkeit hilft, Fehler bei Klein- und Großbuchstaben empfindlichen Funktionen usw. vermieden werden.
- Verwenden Sie keine Leerzeichen, sondern den Unterstrich (_).
- Verwenden Sie in den Namen keine Zahlen, sondern nur englische Buchstaben.
- Verwenden Sie gültige verständliche Namen.
- Namen sollten selbsterklärend sein.
- Namen dürfen nicht mehr als 64 Zeichen enthalten.
- Vermeiden Sie die Verwendung von Präfixen.
Regeln für DatenbanknamenBefolgen Sie alle oben genannten allgemeinen Regeln.
- Der Name kann sowohl im Singular als auch im Plural stehen, aber die Datenbank stellt eine Datenbank dar, daher sollte sie so oft wie möglich im Singular stehen.
- Vermeiden Sie nach Möglichkeit Präfixe.
Regeln für TabellennamenVerwenden Sie Kleinbuchstaben für Tabellennamen: MySQL wird normalerweise auf Linux-Servern gehostet, es wird zwischen Groß- und Kleinschreibung unterschieden, daher empfiehlt es sich, Tabellennamen in Kleinbuchstaben zu schreiben.
- Die Namen der Tabellen müssen im Singular stehen: die Tabelle ist eine einzelne Entität, ebenso wie das Modell, daher ist es seltsam, den Namen der Tabelle im Plural zu haben.
- Präfixe im Tabellennamen: Wir haben oft gesehen, dass Tabellen der Name der Datenbank oder der Name des Projekts vorangestellt wird. Manchmal ist dies notwendig, wenn wir in unserem Projekt viele Datenbanken haben, um die Einschränkungen einiger Hosting-Provider zu überwinden. Wenn dies jedoch nicht erforderlich ist und unser Projekt klein ist, vermeiden Sie die Verwendung von Präfixen.
Name der FelderVerwenden Sie alle oben genannten Regeln, dh verwenden Sie Kleinbuchstaben, verwenden Sie keine Leerzeichen, verwenden Sie keine Zahlen und vermeiden Sie Präfixe.
- Verwenden Sie nach Möglichkeit ein oder zwei kurze Wörter.
- Die Namen der Felder müssen verständlich sein, zum Beispiel: Preis, Firmenname, etc.
- Primärer Spaltenname: Der Primärschlüssel kann den ID-Namen oder den Tabellennamen _id haben. Das wird von der Wahl abhängen.
- Vermeiden Sie reservierte Wörter in den Feldern: *****, Datum usw. In diesen Fällen ist es vorzuziehen, Präfixe wie record_date usw. zu verwenden.
- Vermeiden Sie die Verwendung von Spaltennamen mit demselben Tabellennamen. Dies kann beim Schreiben Ihrer Abfragen zu Verwirrung führen.
- Vermeiden Sie Namen in abgekürzten oder verketteten Akronymen.
2. Verwenden Sie immer den richtigen Datentyp
Verwenden Sie Datentypen basierend auf der Art der Daten. Die Verwendung irrelevanter Datentypen kann mehr Platz beanspruchen oder zu Fehlern führen.
BeispielDie Verwendung von varchar (20) zum Speichern von Datetime-Werten anstelle von DATETIME kann zu Fehlern bei datumsbezogenen Zeitberechnungen führen und ist auch bei ungültiger Datenspeicherung möglich.
3. Verwenden Sie CHAR (1) über VARCHAR (1)
Wenn Sie eine einzelne Zeichenfolge gespeichert haben, CHAR (1) verwenden anstelle von VARCHAR (1), da VARCHAR (1) ein zusätzliches Byte zum Speichern von Informationen benötigt. Mit denen es bei der Verwaltung dieser Charaktere zu berücksichtigen ist.
4. CHAR für feste Daten
Verwenden Sie CHAR-Daten, um nur die Daten mit fester Länge zu speichern
Beispiel:
Die Verwendung von CHAR (1000) anstelle von VARCHAR (1000) verbraucht mehr Speicherplatz, wenn die Länge der Daten weniger als 1000 beträgt.
5. Vermeiden Sie die Verwendung regionaler Datumsformate
Bei Verwendung von Datentypen:
- TERMINZEIT
- DATUM
Verwenden Sie immer das Format JJJJ-MM-TT oder das ISO-Datumsformat, das zu Ihrer SQL-Engine passt. Andere regionale Formate wie TT-MM-JJJ, TT-MM-JJJJ werden nicht korrekt gespeichert.
6. Optimiere deine Anfragen für den Cache
die meisten MySQL-Server haben das Cache-System aktiviert. Es ist eine der effektivsten Methoden zur Verbesserung der Leistung, die aus der Hand der Datenbank-Engine kommt. Wenn dieselbe Anfrage mehrmals ausgeführt wird, wird das Ergebnis aus dem Cache geholt, was viel schneller ist.
Das folgende Beispiel ist in PHP:
// Cache funktioniert NICHT $ r = mysql_query ("SELECT name FROM users WHERE record> = CURDATE()");
// Cache funktioniert $ heute = Datum ("J-m-t"); $ r = mysql_query ("SELECT name FROM users WHERE record> = '$ heute'");Der Grund, warum es im ersten Fall nicht funktioniert, liegt an der Verwendung von CURDATE(). Es kann auf alle nicht-deterministischen Funktionen wie NOW() und RAND() angewendet werden. Da sich das von der Funktion zurückgegebene Ergebnis ändern kann, beschließt MySQL, den Cache für diese Abfrage zu deaktivieren.
7. Vermeiden Sie die Verwendung von "SELECT *" in Ihren Abfragen
Als Faustregel gilt: Je mehr Daten aus den Tabellen gelesen werden, desto langsamer wird eine Abfrage durchgeführt. Da einige Produktionstabellen Dutzende von Spalten enthalten können, von denen einige aus großen Datentypen bestehen, wäre es unklug, alle auszuwählen.
Es ist eine gute Angewohnheit Geben Sie die erforderlichen Spalten in Ihrer SELECT-Anweisung an.
8. Verwenden Sie LIMIT 1, wenn Sie nur eine einzelne Zeile wünschen
Manchmal, wenn Sie Ihre Tabellen abfragen und wissen, dass Sie nur eine einzige Zeile benötigen. In diesen Fällen müssen Sie ein einzelnes Ergebnis aus der Datenbank anfordern, sonst wird jede einzelne Übereinstimmung in der WHERE-Klausel überprüft.
In diesen Fällen kann das Hinzufügen von LIMIT 1 zu Ihrer Abfrage die Geschwindigkeit erheblich verbessern. Auf diese Weise stoppt die Datenbank das Scannen von Ergebnissen, sobald sie eines findet, anstatt die gesamte Tabelle oder einen Index zu durchsuchen.
// Ich habe Benutzer aus Madrid? // was NICHT zu tun ist: $ r = mysql_query ("SELECT * FROM user WHERE city =‘ Madrid ’"); if (mysql_num_rows ($ r)> 0) {//…} // viel besser: $ r = mysql_query ("SELECT 1 FROM user WHERE city =‘ Madrid ’LIMIT 1"); if (mysql_num_rows ($ r)> 0) {//…}[Farbe = # a9a9a9]LIMIT-Empfehlung[/Farbe]
9. Verwendung von ***** BY
Die Verwendung von ***** VON es kann die Reaktionszeit in Mehrbenutzerumgebungen verlangsamen. Wir empfehlen daher, die ***** BY-Klausel nur bei Bedarf zu verwenden.
Missbrauchen Sie seine Verwendung nicht.
10. Passenden Basismotor auswählen
Wenn Sie eine Anwendung entwickeln, die häufiger Daten liest als schreibt.
(zum Beispiel: Suchmaschine), wählen Sie die MyISAM-Speicher-Engine aus.
Wenn Sie eine Anwendung entwickeln, die häufiger Daten schreibt als liest
(zum Beispiel: Echtzeit-Banking), wählen Sie die InnoDB-Speicher-Engine.
Die Auswahl der falschen Speicher-Engine wirkt sich auf die Leistung Ihrer Abfragen aus.
11. Verwenden Sie die EXISTS-Klausel bei Bedarf
Wenn Sie nach Daten suchen möchten, verwenden Sie nicht:
If (SELECT count (*) aus Tabelle WHERE col = 'some value')> 0Verwenden Sie stattdessen die EXISTS-Klausel:
If EXISTS (SELECT * from Table WHERE col = 'some value')Was ist schneller in der Reaktionszeit.
12. Verwenden Sie EXPLAIN in Ihren SELECT-Abfragen
Wenn Sie das Schlüsselwort EXPLAIN verwenden, erhalten Sie viele interne Details darüber, was MySQL tut, um Ihre Abfrage auszuführen. Dies kann Ihnen helfen, Engpässe und andere Probleme mit Ihrer Abfrage- oder Tabellenstruktur zu erkennen.
Das Ergebnis einer EXPLAIN-Abfrage zeigt Ihnen die verwendeten Indizes, wie die Tabelle durchsucht, wie sie sortiert wird usw.
Wählen Sie eine SELECT-Abfrage (vorzugsweise eine komplexe mit Joins) und fügen Sie das Wort EXPLAIN am Anfang von allem hinzu. Es gibt die Ergebnisse in einer einfachen Tabelle zurück. Angenommen, ich habe vergessen, eine Spalte zu indizieren, würde uns der folgende Bildschirm anzeigen:
VERGRÖSSERN
Nach dem Hinzufügen des Index zur Zustandstabelle würde es so aussehen:
VERGRÖSSERN
13. Index und verwenden Sie denselben Spaltentyp für Joins
Wenn Ihre Anwendung viele JOIN-Anweisungen enthält, müssen Sie sicherstellen, dass die verknüpften Spalten in beiden Tabellen indiziert sind. Dies beeinflusst, wie MySQL intern optimiert JOIN-Operationen.
Außerdem müssen die Spalten, die Sie verbinden, vom gleichen Typ sein. Wenn Sie beispielsweise eine Spalte vom Typ DECIMAL mit einer Spalte vom Typ INT aus einer anderen Tabelle verknüpfen, kann MySQL mindestens einen der beiden Indizes nicht verwenden. Auch die Zeichenkodierung muss für die Spalten von vom gleichen Typ sein String-Typ.
// Suche nach Firmen in meiner Stadt $ r = mysql_query ("SELECT company_name FROM users LEFT JOIN companyias ON (users.city = companyias.city) WHERE users.id = $ user_id");Beide Städtespalten müssen indiziert sein und beide sollten den gleichen Typ und die gleiche Zeichencodierung aufweisen, sonst muss MySQL die Tabellen vollständig durchsuchen.
14. Verwenden Sie NOT NULL, wenn Sie können
Sofern Sie keinen bestimmten Grund haben, den NULL-Wert zu verwenden, sollten Sie Ihre Spalten immer auf NOT NULL setzen.
Fragen Sie sich zunächst, ob es einen Unterschied zwischen einem leeren String und einem NULL-Wert geben würde (oder bei INT-Feldern: 0 versus NULL). Wenn zwischen den beiden Werten kein Problem besteht, benötigen Sie kein NULL-Feld. NULL-Spalten erfordern zusätzlichen Speicherplatz und können Ihre Vergleichsanweisungen komplexer machen. Vermeiden Sie sie einfach, wann immer Sie können.
Auf jeden Fall verstehen wir, dass es in einigen sehr speziellen Fällen einen Grund gibt, NULL-Spalten zu verwenden, was nicht immer schlecht ist.
15. Tabellen mit fester Größe (statisch) sind schneller
Wenn jede Spalte in einer Tabelle eine feste Länge hat, wird die gesamte Tabelle als "statisch" oder "fester Länge" betrachtet.
Einige Beispiele für Spaltentypen, die KEINE feste Größe haben, sind:
- VARCHAR
- TEXT
- KLECKS
Wenn Sie nur einen dieser Spaltentypen einschließen, hat die Tabelle keine feste Größe mehr und muss vom MySQL-Engine.
Tabellen mit fester Größe können die Produktivität steigern, da die MySQL-Engine Ihre Datensätze schneller durchsucht. Wenn Sie eine bestimmte Zeile in der Tabelle lesen möchten, können Sie ihre Position schnell berechnen. Wenn die Zeilengröße nicht festgelegt ist, müssen Sie bei jeder Suche zuerst den Index des Primärschlüssels abfragen.
Sie sind auch einfacher zu durchsuchen und nach einem Unfall wieder aufzubauen. Andererseits könnten sie aber auch mehr Platz beanspruchen.
16. Vertikale Aufteilung
Vertikale Partitionierung ist die vertikale Trennung Ihrer Tabellenstruktur aus Optimierungsgründen.
Beispiel 1:
Sie werden sicherlich eine Benutzertabelle haben, die eine Postadresse enthält, die nicht sehr oft verwendet wird. Hier könnten Sie die Tabelle aufteilen und die Adressen in einer separaten Tabelle speichern. Auf diese Weise hätte Ihre Hauptbenutzertabelle eine engere Größe. Wie Sie wissen, je kleiner, desto schneller die Tabellen.
Beispiel 2:
Sie haben ein Feld "last_access" in Ihrer Tabelle. Es wird jedes Mal aktualisiert, wenn ein Benutzer auf Ihre Seite zugreift. Aber jeder Zugriff bewirkt, dass der Abfrage-Cache für diese Tabelle freigegeben wird. Sie können dieses Feld in eine andere Tabelle einfügen, damit die Änderungen in Ihrer Benutzertabelle auf ein Minimum beschränkt werden.
Sie müssen aber auch sicherstellen, dass Sie die beiden Tabellen nach der Partitionierung nicht ständig verbinden müssen, da Sie sonst einen Leistungsabfall erleiden, genau das Gegenteil von dem, was wir gesucht haben.
17. Speichert IP-Adressen als UNSIGNED INT
Viele Programmierer würden ein VARCHAR-Feld (15) ohne zu wissen, dass sie IP-Adressen als ganze Zahlen speichern können. Wenn Sie eine INT verwenden, verwenden Sie nur 4 Byte im Speicher, und sie hat auch eine feste Größe in der Tabelle.
Aber Sie müssen sicherstellen, dass die Spalte ist UNSIGNED INT (unsigned integer), da IP-Adressen den gesamten 32-Bit-Bereich ohne Vorzeichen verwenden.
In Ihren Anfragen können Sie die INET_ATON ()-Funktion um eine IP-Adresse in eine ganze Zahl umzuwandeln, und INET_NTOA(), um das Gegenteil zu tun. Es gibt auch ähnliche Funktionen in PHP namens ip2long() Ja long2ip().
18. Erstellen Sie Ansichten, um die allgemeine Verwendung in Tabellen zu vereinfachen
Ansichten vereinfachen sowohl komplexe Schemata als auch die Sicherheitsimplementierung. Eine Möglichkeit, zum Sicherheitsteil beizutragen, besteht darin, dass Sie die Namen der Felder vor den Entwicklern verbergen können.
Es kann auch verwendet werden, um nicht indizierte Spalten zu filtern, sodass nur die Felder übrig bleiben, die bei der Suche schneller angezeigt werden.
19. Verwenden Sie nicht ***** BY RAND ()
Dies ist einer dieser Tricks, die auf den ersten Blick großartig klingen und bei denen viele Programmieranfänger eher fallen. Möglicherweise haben Sie den unglaublichen Engpass nicht erkannt, der durch die Verwendung dieser Technik in Ihren Anfragen verursacht werden kann.
Wenn Sie wirklich zufällige Tabellen für Ihr Ergebnis benötigen, gibt es viel bessere Möglichkeiten, dies zu tun. Es ist klar, dass sie mehr Code benötigen, aber Sie verhindern einen möglichen Engpass, der mit zunehmendem Inhalt exponentiell zunimmt.
Das Problem ist, dass MySQL laufen muss RAND () (was Rechenleistung erfordert) für jede der Zeilen, bevor Sie sie sortieren und eine einzelne Zeile zurückgeben.
// der Weg, es NICHT zu tun: $ r = mysql_query ("SELECT username FROM user ***** BY RAND () LIMIT 1"); // viel besser: $ r = mysql_query ("SELECT count (*) FROM user"); $ d = mysql_fetch_row ($ r); $rand = mt_rand (0, $d[0] – 1); $ r = mysql_query ("SELECT username FROM username LIMIT $ rand, 1");Sie wählen also eine Zufallszahl, die kleiner als die Anzahl der Ergebnisse ist, und verwenden diese als Offset in der LIMIT-Klausel.
20. Optimieren Sie die WHERE-Klausel
Das sind ein paar Tipps zur Optimierung der WHERE-Klausel:
- Entfernen Sie unnötige Klammern. Zum Beispiel:
Von bis5 UND b = c UND a = 5
- ZÄHLEN (*) es ist optimiert, um ein SELECT viel schneller zurückzugeben, solange es sich um eine Tabelle handelt und ohne WHERE zu verwenden. Zum Beispiel:
SELECT COUNT (*) FROM-Tabelle.
- Das SQL_SMALL_RESULT-Option, kann verwendet werden mit GRUPPIERE NACH oder UNTERSCHEIDBAR um anzuzeigen, dass die Ergebnismenge klein ist. In diesem Fall verwendet MySQL sehr schnelle temporäre Tabellen, um die resultierende Tabelle zu speichern, anstatt eine Sortierung zu verwenden.
MySQL-Tutorials