Heim > Datenbank > MySQL-Tutorial > Wie können wir eine langsame MySQL-SELECT-Abfrage optimieren, um die Webseitenleistung zu verbessern?

Wie können wir eine langsame MySQL-SELECT-Abfrage optimieren, um die Webseitenleistung zu verbessern?

Linda Hamilton
Freigeben: 2024-12-30 08:39:14
Original
508 Leute haben es durchsucht

How Can We Optimize a Slow MySQL SELECT Query to Improve Web Page Performance?

Langsame MySQL-Auswahlabfrage zur Leistungssteigerung optimiert

Bei dieser MySQL-Abfrage kam es aufgrund ihrer Komplexität und des Datenvolumens zu Verzögerungen. Um dies zu mildern, ist es wichtig, die Beziehungen zwischen den beteiligten Tabellen zu verstehen:

  • poster_data: Speichert Daten zu einzelnen Postern.
  • poster_categories: Listet alle verfügbaren Kategorien auf (z. B. Filme, Kunst).
  • poster_prodcat: Verlinkt Poster zu ihren jeweiligen Kategorien, wobei mehrere Einträge für ein einzelnes Poster möglich sind.

Die ursprüngliche Abfrage wurde wie folgt angezeigt eine lange Ausführungszeit, insbesondere bei Verwendung bei der Webseitenerstellung:

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
Nach dem Login kopieren

Analyse der Ausführung Plan:

Der Leistungsengpass der Abfrage wurde in der „explain“-Ausgabe identifiziert:

[Explain Image Link]

Wie beobachtet, musste die Abfrage Daten schreiben auf die Festplatte, was sich erheblich auf die Geschwindigkeit auswirkt.

Lösung:

Zu beheben Für dieses Problem wurde ein überarbeitetes Schema mithilfe der zusammengesetzten Indizierung entworfen. Diese neue Struktur zeigte erhebliche Leistungsverbesserungen:

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

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

DROP TABLE IF EXISTS poster_category;
CREATE TABLE poster_category
(
cat_id MEDIUMINT UNSIGNED NOT NULL,
poster_id INT UNSIGNED NOT NULL,
PRIMARY KEY (cat_id, poster_id) -- Note the clustered composite index !!
)
ENGINE = INNODB;
Nach dem Login kopieren

Mit dem zusammengesetzten Index lieferte die folgende überarbeitete Abfrage blitzschnelle Ergebnisse:

SELECT
p.*,
c.*
FROM
poster_category pc
INNER JOIN category c ON pc.cat_id = c.cat_id
INNER JOIN poster p ON pc.poster_id = p.poster_id
WHERE
pc.cat_id = 623
ORDER BY
p.name
LIMIT 32;
Nach dem Login kopieren

Dieser optimierte Ansatz löste das Problem effektiv Leistungsprobleme, wodurch die Anwendungswebseite reaktionsfähig und benutzerfreundlich wird.

Das obige ist der detaillierte Inhalt vonWie können wir eine langsame MySQL-SELECT-Abfrage optimieren, um die Webseitenleistung zu verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage