Im Laravel -Projekt ist es bei zunehmender Datenbank nicht ungewöhnlich, dass Datenbank die Geschwindigkeit abfragt. Kürzlich, als ich das Back End einer Immobilienplattform optimiert habe, habe ich dieses Problem gestoßen und einige Lektionen daraus gelernt.
Die
-Datenbankoptimierung ist einer der wichtigsten Bereiche für entwicklungsfähige und hohe Leistungsanwendungen. Es kann die Datenabnahmegeschwindigkeit verbessern, die Reaktionszeit und die Ladezeit der Seite verkürzen und die Serverlast verkürzen und die Kosten minimieren.
Die Herausforderung der Immobilienplattform
Stellen Sie sich vor: Sie bauen eine hervorragende Immobilienplattform, die mehrere Städte dient und mit fortschrittlichen Suchfiltern ausgestattet ist. Die Immobilienliste wird schnell geladen, der Suchfilter reagiert schnell und alles sieht perfekt aus. Mit der Erweiterung der Anwendungsskala und des Wachstums der Benutzerbasis haben die Anfragen, die während des Entwicklungsprozesses perfekt durchgeführt wurden, jedoch immer länger ausgeführt. Klingt es bekannt?
genau das ist unsere Plattform. Die Sentry Alert verfügt über eine langsame Datenbankabfrage in der Produktionsumgebung, die uns eine Warnung macht. Die Überwachung zeigt, dass die Abfrage der Suchergebnisse mehr als 5 Sekunden dauert, bis es abgeschlossen ist. Dies ist alles andere als die schnelle Erfahrung, die wir versprechen!
Gemeinsame Abfragefehler (wie man vermeidet)
1. n 1 Anfrage Frage: Der geheime Feind der Datenbank
Erinnerst du dich, wenn du das Spiel spielst, wird das Besiegen eines Feindes mehrere kleinere Feinde erzeugen? Dies ist im Wesentlichen das gleiche wie das N 1 -Abfrageproblem in Laravel. Sie erhalten die Liste der Immobilien und stellen dann zusätzliche Anfragen für jede Eigenschaft, um verwandte Daten zu erhalten. Bevor Sie erkennen, befasst sich Ihre Datenbank mit Hunderten von Anfragen, nicht nur mit einer.
Folgendes ist sein typischer Ausdruck:
<code>// 优化前
$properties = Property::all();
foreach ($properties as $property) {
echo $property->agent->name; // 每个房产都会触发一个新的查询
}
// 优化后
// 使用 `with()` 进行预加载
$properties = Property::with(['agent'])->get();
foreach ($properties as $property) {
echo $property->agent->name; // 不需要额外的查询!
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
2. Die Kunst des Datenbankindex
kann den Datenbankindex mit dem Index des Schreibens vergleichen. Sie können Ihnen helfen, das zu finden, was Sie wollen, ohne jede Seite zu scannen. Der Index wird jedoch nicht nur zu jeder Spalte hinzugefügt. Lassen Sie uns im Depth erkunden.
Verstehen Sie verschiedene Arten von Indizes
<code>// 基本的单列索引
Schema::table('properties', function (Blueprint $table) {
$table->index('price');
});
// 多列的组合索引
Schema::table('properties', function (Blueprint $table) {
$table->index(['city', 'price']); // 顺序很重要!
});
// 唯一索引
Schema::table('properties', function (Blueprint $table) {
$table->unique('property_code');
});</code>
Nach dem Login kopieren
Nach dem Login kopieren
Die Best Practice of Index Strategie
Die Sequenz der Spalten im Kombinationsindex ist wichtig -
<code> // 良好:匹配查询模式
$properties = Property::where('city', 'New York')
->whereBetween('price', [200000, 500000])
->get();
// 索引应匹配此模式
$table->index(['city', 'price']); // 首先是城市,然后是价格</code>
Nach dem Login kopieren
Nach dem Login kopieren
selektiver Index -
Nicht jede Spalte erfordert Indizes. Auswählen einiger Spalten, um einige Spalten zu indexieren, gehören:
Die Spalten, die häufig in der WHERE -Klausel und in der Reihenfolge nach Anweisung verwendet
Spalte der Außenschlüssel index -
Index keine Spalten mit niedriger Selektivität (z. B. dem Booleschen Logo) -
-
Die Verwendung des Überwachungsindex -
3. Wählen Sie den Inhalt aus, den Sie benötigen, und nicht den gesamten Inhalt
Einer der häufigsten Fehler, die ich je gesehen (und angeboten) habe, ist die Verwendung von Select *standardmäßig. Dies ist wie in ein Lebensmittelgeschäft zu gehen, aber Dinge aus dem gesamten Geschäft zu kaufen, und Sie benötigen nur eine Mahlzeit. Das Folgende ist ein besserer Weg:
<code> -- 检查索引使用情况的 MySQL 查询
SELECT
table_name,
index_name,
index_type,
stat_name,
stat_value
FROM mysql.index_statistics
WHERE table_name = 'properties';</code>
Nach dem Login kopieren
<code>// 优化前
$properties = Property::all();
foreach ($properties as $property) {
echo $property->agent->name; // 每个房产都会触发一个新的查询
}
// 优化后
// 使用 `with()` 进行预加载
$properties = Property::with(['agent'])->get();
foreach ($properties as $property) {
echo $property->agent->name; // 不需要额外的查询!
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
4. Für die Segmentierung des großen Datensatzes
Bei der Verarbeitung großer Datensätze handeln Sie alle Inhalte in einem einzigen Vorgang, der die Ressourcen des Systems überwältigen und Engpässe verursachen kann. Stattdessen können Sie die Chunk -Methode von Laravel verwenden, um die Datensatzverarbeitungsdatensätze aufzuzeichnen:
<code>// 基本的单列索引
Schema::table('properties', function (Blueprint $table) {
$table->index('price');
});
// 多列的组合索引
Schema::table('properties', function (Blueprint $table) {
$table->index(['city', 'price']); // 顺序很重要!
});
// 唯一索引
Schema::table('properties', function (Blueprint $table) {
$table->unique('property_code');
});</code>
Nach dem Login kopieren
Nach dem Login kopieren
5. Effektive und effektive Cache -Strategie
Caches ist wie ein guter Assistent, der sich an alles erinnern kann. Wie jeder Assistent benötigt es jedoch klare Anweisungen.
<code> // 良好:匹配查询模式
$properties = Property::where('city', 'New York')
->whereBetween('price', [200000, 500000])
->get();
// 索引应匹配此模式
$table->index(['city', 'price']); // 首先是城市,然后是价格</code>
Nach dem Login kopieren
Nach dem Login kopieren
Professionelle Tipps: Schneiden Sie nicht alles ein! Konzentrieren Sie sich auf: <:>
auf die Daten, auf die häufig auf - zugegriffen wird
Berechnen Sie die Daten mit hohen Kosten -
Die Daten, die nicht häufig geändert werden -
Best Practice
überwachen zuerst und dann - optimieren
Steigen Sie nicht in die Falle der vorzeitigen Optimierung ein. Verwenden Sie Tools wie Laravels gebaute Abfrageprotokolle oder Teleskop, um den tatsächlichen Engpass zu identifizieren.
mit dem Sammeln anstelle des Zyklus
nachdenken
Wenn Sie feststellen, dass Sie eine Foreach -Schleife geschrieben haben, die die Datenbank abfragt, treten Sie bitte einen Schritt zurück und fragen Sie, ob Sie eine einzige Abfrage verwenden können, um sich damit zu befassen. -
strategisch anrufen
Nicht alles muss zwischengespeichert werden. Achten Sie auf den häufigsten Zugang und hohe Kostenanfragen.
- Erstellen Sie den Index
Bekämpft des Index als Verzeichnis des Buches -Sie brauchen genug Details, um schnell Dinge zu finden, aber nicht zu viel und das Verzeichnis ist länger als das Buch selbst.
- gemeinsame Defekte, die vermieden werden müssen
Nicht "vor -laden" die unnötige Beziehung
Vermeiden Sie die Abfrage im Zyklus (Falle des N 1 -Problems für die Tarnung)
- wechseln Sie nicht alles -manchmal übersteigt der Overhead des Cache -Managements die Vorteile
- Wenn Sie den OrderBy für die Nicht -Index -Spalten großer Datensätze verwenden, sollten Sie vorsichtig
- Erstellen Sie keine Indizes für Spalten, die selten in den Klauseln
verwendet werden
- Vermeiden Sie häufige Aktualisierungen;
- Schlussfolgerung: Dies ist eine Reise, nicht das Ziel
- Datenbankoptimierung ist keine Eins -Zeit -Aufgabe, die aus der Liste ausgewählt werden kann. Es ist eher so, als würde man sich um den Garten kümmern -
regelmäßige Wartung und Aufmerksamkeit, um die besten Ergebnisse zu erhalten
. Ausgehend von diesen Grundkenntnissen verbessert die Überwachung der Leistung der Anwendung Ihre Methode weiter.
Denken Sie daran, das Ziel ist nicht, jede Optimierungstechnologie zu erreichen, die Sie kennen. Stattdessen müssen Sie einen Ausgleichspunkt finden, der für Ihre spezifischen Anwendungsfälle zwischen Code -Wartung und Leistung
geeignet ist. Manchmal ist eine einfache Aussage vor dem Laden hilfreicher als ein paar Stunden damit, komplexe Optimierungsstrategien durchzuführen.
Was sind Sie im Laravel -Projekt und auf welche Probleme haben Sie im Laravel -Projekt gestoßen? Lassen Sie uns in den Kommentaren diskutieren!
Das obige ist der detaillierte Inhalt vonLaravel Performance -Tuning: Optimierung der Datenbankabfragen für die Skalierbarkeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!