Optimieren Sie Ihre Abfragen für Abfragen
Auf den meisten MySQL-Servern ist das Abfrage-Caching aktiviert. Dies ist eine der effektivsten Möglichkeiten zur Leistungsverbesserung und wird von der MySQL-Datenbank-Engine verwaltet. Wenn viele der gleichen Abfragen mehrmals ausgeführt werden, werden die Abfrageergebnisse in einem Cache abgelegt, sodass nachfolgende identische Abfragen die Tabelle nicht bedienen müssen, sondern direkt auf die zwischengespeicherten Ergebnisse zugreifen.
Das Hauptproblem besteht darin, dass Programmierer diese Angelegenheit leicht übersehen. Weil einige unserer Abfrageanweisungen dazu führen, dass MySQL den Cache nicht verwendet. Schauen Sie sich bitte das folgende Beispiel an:
// 查询缓存不开启 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // 开启查询缓存 $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
Der Unterschied zwischen den beiden oben genannten SQL-Anweisungen besteht darin, dass der Abfragecache von MySQL bei dieser Funktion nicht funktioniert. Daher ermöglichen SQL-Funktionen wie NOW() und RAND() oder andere ähnliche Funktionen kein Abfrage-Caching, da die Rückgaben dieser Funktionen flüchtig sind. Sie müssen also lediglich die MySQL-Funktion durch eine Variable ersetzen, um das Caching zu aktivieren.
Erlernen Sie die Verwendung von EXPLAIN
Mit dem Schlüsselwort EXPLAIN erfahren Sie, wie MySQL Ihre SQL-Anweisung verarbeitet.
select id, title, cate from news where cate = 1
stellte fest, dass die Abfrage langsam war, und fügte dann einen Index für das Feld „cate“ hinzu, was die Abfrage beschleunigen würde.
Verwenden Sie LIMIT 1, wenn nur eine Datenzeile vorhanden ist
Manchmal benötigen Sie beim Abfragen der Tabelle nur ein Datenelement. Verwenden Sie daher bitte Limit 1.
Indizes richtig verwenden
Indizes gelten nicht unbedingt für Primärschlüssel oder eindeutige Felder. Wenn es in Ihrer Tabelle ein Feld gibt, das Sie immer für Suchen, Fotos und Bedingungen verwenden, dann erstellen Sie bitte einen Index dafür.
Nicht ORDER BY RAND()
Eine sehr ineffiziente Zufallsabfrage.
SELECT * vermeiden
Je mehr Daten aus der Datenbank gelesen werden, desto langsamer wird die Abfrage. Wenn Ihr Datenbankserver und Ihr WEB-Server außerdem zwei unabhängige Server sind, erhöht dies auch die Belastung der Netzwerkübertragung. Sie müssen eine gute Angewohnheit entwickeln, alles zu sich zu nehmen, was Sie brauchen.
Verwenden Sie ENUM anstelle von VARCHAR
Der ENUM-Typ ist sehr schnell und kompakt. Tatsächlich enthält es einen TINYINT, erscheint jedoch als Zeichenfolge. Auf diese Weise ist es ideal, dieses Feld zum Erstellen einiger Auswahllisten zu verwenden.
Wenn Sie ein Feld wie „Geschlecht“, „Land“, „Ethnie“, „Status“ oder „Abteilung“ haben und wissen, dass die Werte dieser Felder begrenzt und fest sind, Dann sollten Sie ENUM anstelle von VARCHAR verwenden.
Verwenden Sie NOT NULL
Es sei denn, Sie haben einen ganz bestimmten Grund, NULL-Werte zu verwenden, sollten Sie Ihre Felder immer auf NOT NULL belassen. Das mag etwas kontrovers erscheinen, bitte lesen Sie weiter.
Fragen Sie sich zunächst, was der Unterschied zwischen „Leer“ und „NULL“ ist (im Fall von INT sind das 0 und NULL)? Wenn Sie der Meinung sind, dass zwischen ihnen kein Unterschied besteht, sollten Sie NULL nicht verwenden. (Wussten Sie schon? In Oracle sind NULL und leere Zeichenfolgen gleich!)
Denken Sie nicht, dass NULL keinen Platz benötigt, es benötigt zusätzlichen Platz, und wenn Sie vergleichen, wird Ihr Verfahren mehr sein kompliziert. Dies bedeutet natürlich nicht, dass Sie nicht NULL verwenden können. Die Realität ist sehr kompliziert und es wird immer noch Situationen geben, in denen Sie NULL-Werte verwenden müssen.
Das Folgende ist ein Auszug aus der MySQL-eigenen Dokumentation
„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.“
Die IP-Adresse wird als UNSIGNED INT gespeichert
Viele Programmierer erstellen ein VARCHAR(15)-Feld, um die IP zu speichern die Form einer Zeichenfolge anstelle einer ganzzahligen IP. Wenn Sie zum Speichern eine Ganzzahl verwenden, sind nur 4 Bytes erforderlich, und Sie können Felder mit fester Länge haben. Darüber hinaus bringt Ihnen dies Vorteile bei der Abfrage, insbesondere wenn Sie WHERE-Bedingungen wie diese verwenden müssen: IP zwischen ip1 und ip2.
Wir müssen UNSIGNED INT verwenden, da die IP-Adresse die gesamte 32-Bit-Ganzzahl ohne Vorzeichen verwendet
Eine Tabelle mit fester Länge ist schneller
Wenn alle Felder in einer Tabelle „feste Länge“ haben, gilt die gesamte Tabelle als „statisch“ oder „feste Länge“. Beispielsweise enthält die Tabelle keine Felder der folgenden Typen: VARCHAR, TEXT, BLOB. Solange Sie eines dieser Felder einschließen, ist die Tabelle keine „statische Tabelle fester Länge“ mehr und die MySQL-Engine verarbeitet sie auf andere Weise.
Tabellen mit fester Länge verbessern die Leistung, da MySQL schneller sucht. Da diese festen Längen die Berechnung des Offsets der nächsten Daten erleichtern, erfolgt das Lesen natürlich schneller. Und wenn das Feld keine feste Länge hat, muss das Programm jedes Mal, wenn Sie das nächste finden möchten, den Primärschlüssel finden.
Außerdem lassen sich Tabellen mit fester Länge einfacher zwischenspeichern und neu erstellen. Der einzige Nebeneffekt besteht jedoch darin, dass Felder mit fester Länge etwas Platz verschwenden, da Felder mit fester Länge unabhängig davon, ob Sie sie verwenden oder nicht, so viel Platz beanspruchen.
Vertikale Aufteilung
„Vertikale Aufteilung“ ist eine Methode zum Umwandeln der Tabellen in der Datenbank in mehrere Tabellen nach Spalten, wodurch die Komplexität der Tabelle und die Anzahl der Felder reduziert und so Optimierungszwecke erreicht werden können. Es ist zu beachten, dass Sie die durch diese getrennten Felder gebildeten Tabellen nicht häufig verknüpfen, da sonst die Leistung schlechter ist als wenn sie nicht geteilt wird.
Teilen Sie eine große DELETE- oder INSERT-Anweisung auf
Wenn Sie eine große DELETE- oder INSERT-Abfrage auf einer Online-Website ausführen, müssen Sie sehr vorsichtig sein, um die Ursache des Vorgangs zu vermeiden Ihre gesamte Website reagiert nicht mehr. Da diese beiden Vorgänge die Tabelle sperren, können nach dem Sperren der Tabelle keine anderen Vorgänge mehr eingegeben werden.
Apache wird viele untergeordnete Prozesse oder Threads haben. Daher arbeitet es recht effizient und unser Server möchte nicht zu viele untergeordnete Prozesse, Threads und Datenbankverknüpfungen haben. Dies beansprucht viele Serverressourcen, insbesondere Speicher.
Wenn Sie Ihre Tabelle für einen bestimmten Zeitraum, z. B. 30 Sekunden, sperren, werden für eine Website mit einer hohen Anzahl von Besuchen die in diesen 30 Sekunden angesammelten Zugriffsprozesse/Threads, Datenbankverknüpfungen und offene Nummern angezeigt Eine große Anzahl von Dateien kann nicht nur zum Absturz Ihres WEB-Dienstes führen, sondern auch dazu, dass Ihr gesamter Server sofort einfriert.
Kleinere Spalten sind schneller
Für die meisten Datenbank-Engines sind Festplattenvorgänge wahrscheinlich der größte Engpass. Daher kann es in dieser Situation sehr hilfreich sein, Ihre Daten zu komprimieren, da dadurch der Zugriff auf die Festplatte verringert wird.
Wählen Sie die richtige Speicher-Engine
Es gibt zwei Speicher-Engines in MySQL, MyISAM und InnoDB, und jede Engine hat Vor- und Nachteile.
MyISAM eignet sich für Anwendungen, die eine große Anzahl von Abfragen erfordern, ist jedoch nicht sehr gut für eine große Anzahl von Schreibvorgängen. Selbst wenn Sie nur ein Feld aktualisieren müssen, wird die gesamte Tabelle gesperrt und andere Prozesse, auch der Lesevorgang, können nicht ausgeführt werden, bis der Lesevorgang abgeschlossen ist. Darüber hinaus ist MyISAM bei Berechnungen wie SELECT COUNT(*) extrem schnell.
Der Trend von InnoDB wird eine sehr komplexe Speicher-Engine sein, und für einige kleine Anwendungen wird sie langsamer sein als MyISAM. Der andere Grund ist, dass es die „Zeilensperre“ unterstützt, sodass es besser ist, wenn mehr Schreibvorgänge ausgeführt werden. Darüber hinaus werden auch fortgeschrittenere Anwendungen wie Transaktionen unterstützt.
Das obige ist der detaillierte Inhalt vonEtwas Erfahrung in der MySQL-Leistungsoptimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!