Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine langsame MySQL-Abfrage optimieren, um die Leistung zu verbessern und die Festplatten-E/A zu reduzieren?

Wie kann ich eine langsame MySQL-Abfrage optimieren, um die Leistung zu verbessern und die Festplatten-E/A zu reduzieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-30 20:24:11964Durchsuche

How Can I Optimize a Slow MySQL Query to Improve Performance and Reduce Disk I/O?

MySQL-Abfrage optimieren, um Ausführungszeit und Festplattenschreibvorgänge zu reduzieren

Bei Ihrer MySQL-Abfrage treten Leistungsprobleme auf, sodass die Fertigstellung und das Schreiben darauf mehrere Minuten dauern Festplatte während der Ausführung. Dies kann die Reaktionsfähigkeit Ihrer Webseite erheblich beeinträchtigen. Um dieses Problem anzugehen, werden wir eine Lösung untersuchen, die Datenmodellierung und Indexoptimierung umfasst.

Die von Ihnen erwähnte langsame Abfrage ist:

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
  AND poster_categories.apcatnum = poster_prodcat.apcatnum 
  AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32

Laut der EXPLAIN-Ausgabe führt die Abfrage eine vollständige Abfrage durch Tabellenscan für die Tabelle poster_prodcat, die über 17 Millionen Zeilen enthält. Dies trägt zur übermäßigen Ausführungszeit bei.

Um die Abfrageleistung zu optimieren, können wir die folgenden Änderungen implementieren:

Normalisierung und Indizierung:

  1. Normalisieren Sie die Daten: Konvertieren Sie die Tabelle poster_prodcat in eine normalisierte Struktur mit zwei Tabellen: Poster und Kategorie. Erstellen Sie eine dritte Tabelle, poster_category, um die Beziehung zwischen Postern und Kategorien festzulegen.
  2. Indizes erstellen: Erstellen Sie Indizes für die entsprechenden Spalten in den Tabellen „poster“, „category“ und „poster_category“. Dadurch kann die Datenbank Daten schnell finden, ohne vollständige Tabellenscans durchführen zu müssen.

Hier ist ein Beispiel des aktualisierten Schemas:

CREATE TABLE poster (
  poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (poster_id)
) ENGINE=InnoDB;

CREATE TABLE category (
  cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (cat_id)
) ENGINE=InnoDB;

CREATE TABLE poster_category (
  cat_id MEDIUMINT UNSIGNED NOT NULL,
  poster_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (cat_id, poster_id),
  INDEX (poster_id) -- Clustered composite index
) ENGINE=InnoDB;

Sobald die Daten normalisiert und indiziert sind , sollte die Abfrage viel schneller ausgeführt werden, was die Ausführungszeit erheblich verkürzt.

Das obige ist der detaillierte Inhalt vonWie kann ich eine langsame MySQL-Abfrage optimieren, um die Leistung zu verbessern und die Festplatten-E/A zu reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn