0Pricing
PHP Academy · Lektion

Datenbankabfragen optimieren

Erkennen Sie N+1-Abfragen, fügen Sie Indizes hinzu und reduzieren Sie die Anzahl der Abfragen.

Datenbankabfragen optimieren ist eine kostenlose PHP Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des PHP Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.

Langsame Abfragen identifizieren

Aktivieren Sie das MySQL-Log für langsame Abfragen und legen Sie einen Schwellenwert fest. Überprüfen Sie Abfragen, die länger als erwartet dauern.

# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5  # log queries over 500ms

EXPLAIN / EXPLAIN ANALYZE

Verwenden Sie EXPLAIN, um zu verstehen, wie MySQL eine Abfrage ausführt und ob Indizes verwendet werden.

-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)

Indizes hinzufügen

Indizes beschleunigen Lesezugriffe auf gefilterten und sortierten Spalten erheblich.

-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

// In Laravel migration:
$table->index(["user_id", "status"]);

N+1-Abfrageproblem

Beim N+1-Problem wird eine Abfrage zum Abrufen einer Liste und zusätzlich eine Abfrage pro Element für eine Beziehung ausgeführt. Beheben Sie dies mit Eager Loading.

<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;

// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;

Nur benötigte Spalten auswählen

Vermeiden Sie SELECT * – rufen Sie nur die benötigten Spalten ab, um Speichernutzung und Netzwerkübertragung zu reduzieren.

<?php
// Bad:
$users = User::all();

// Good:
$users = User::select("id", "name", "email")->get();

Große Datenmengen in Blöcken verarbeiten

Verarbeiten Sie große Ergebnismengen in Blöcken, um eine Erschöpfung des Arbeitsspeichers zu vermeiden.

<?php
User::chunk(500, function ($users) {
    foreach ($users as $user) {
        // process each user
    }
});

// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));

Abfrage-Caching

Stellen Sie aufwendige Aggregationen und Berichte, die sich nicht häufig ändern, im Cache bereit.

<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
    return Order::whereMonth("created_at", now()->month)->sum("total");
});

Abfragen in Schleifen vermeiden

Führen Sie niemals Abfragen innerhalb von foreach-Schleifen aus. Sammeln Sie zuerst die IDs und rufen Sie die Daten anschließend mit einer einzigen Abfrage ab.

<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");

foreach ($cartItems as $item) {
    $product = $products[$item["product_id"]];
}

Pooling von Datenbankverbindungen

PHP-FPM erstellt pro Worker eine neue PDO-Verbindung. PgBouncer oder ProxySQL können Verbindungen bündeln und verhindern, dass der Verbindungsaufwand die Datenbank überlastet.

Abdeckende Indizes

Ein abdeckender Index enthält alle Spalten, die zum Erfüllen einer Abfrage benötigt werden. MySQL kann die Abfrage allein anhand des Index beantworten, ohne auf die Zeilen der Haupttabelle zuzugreifen.

Zusammenfassung

Aktivieren Sie Logs für langsame Abfragen. Verwenden Sie EXPLAIN, um fehlende Indizes zu finden. Laden Sie Beziehungen per Eager Loading vorab. Wählen Sie nur benötigte Spalten aus. Verarbeiten Sie große Datenmengen in Blöcken. Stellen Sie aufwendige Aggregationen aus dem Cache bereit. Vermeiden Sie Abfragen innerhalb von Schleifen.

Kurze Überprüfung

Was ist das N+1-Abfrageproblem?

Häufig gestellte Fragen

Ist die Lektion „Datenbankabfragen optimieren“ kostenlos?

Ja — der vollständige Text von „Datenbankabfragen optimieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des PHP Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Datenbankabfragen optimieren“?

Erkennen Sie N+1-Abfragen, fügen Sie Indizes hinzu und reduzieren Sie die Anzahl der Abfragen. Du übst PHP Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um PHP Academy zu starten?

Keine Vorkenntnisse erforderlich. PHP Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Datenbankabfragen optimieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser PHP Academy-Lektion Code schreiben und ausführen?

Ja. Jede PHP Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. PHP mit Xdebug profilieren
  2. OPcache: Bytecode-Caching
  3. Datenbankabfragen optimieren
  4. Speicherverwaltung und Performance-Tipps
← Zurück zu PHP Academy