Wie diese Low-Performance MySQL-Abfrage optimieren?
-
01-10-2019 - |
Frage
Ich bin derzeit die folgende Abfrage für jsPerf. Im wahrscheinlich Falls Sie nicht jsPerf wissen - es gibt zwei Tabellen: pages
mit dem Testfall / Revisionen und tests
die Code-Snippets für die Tests innerhalb der Testfälle mit
Es gibt zur Zeit 937 Datensätze in pages
und 3817 Datensätze in tests
.
Wie Sie sehen können, dauert es eine ganze Weile, die „Durchsuchen jsPerf“ zu laden, wo diese Abfrage verwendet wird.
Die Abfrage dauert ca. 7 Sekunden auszuführen:
SELECT
id AS pID,
slug AS url,
revision,
title,
published,
updated,
(
SELECT COUNT(*)
FROM pages
WHERE slug = url
AND visible = "y"
) AS revisionCount,
(
SELECT COUNT(*)
FROM tests
WHERE pageID = pID
) AS testCount
FROM pages
WHERE updated IN (
SELECT MAX(updated)
FROM pages
WHERE visible = "y"
GROUP BY slug
)
AND visible = "y"
ORDER BY updated DESC
Ich habe Indizes auf allen Feldern hinzugefügt, die in WHERE
Klauseln erscheinen. Sollte ich hinzufügen mehr?
Wie kann diese Abfrage optimiert werden?
P. S. Ich weiß, ich könnte ein Caching-System in PHP implementieren. - Ich wahrscheinlich, also bitte sag mir nicht :) Ich habe gerade wirklich wie um herauszufinden, wie diese Abfrage verbessert werden könnte, zu
Lösung
Verwendung:
SELECT x.id AS pID,
x.slug AS url,
x.revision,
x.title,
x.published,
x.updated,
y.revisionCount,
COALESCE(z.testCount, 0) AS testCount
FROM pages x
JOIN (SELECT p.slug,
MAX(p.updated) AS max_updated,
COUNT(*) AS revisionCount
FROM pages p
WHERE p.visible = 'y'
GROUP BY p.slug) y ON y.slug = x.slug
AND y.max_updated = x.updated
LEFT JOIN (SELECT t.pageid,
COUNT(*) AS testCount
FROM tests t
GROUP BY t.pageid) z ON z.pageid = x.id
ORDER BY updated DESC
Andere Tipps
Sie wollen lernen, wie EXPLAIN zu verwenden. Dies wird die SQL-Anweisung, ausführen und zeigen Ihnen, welche Indizes verwendet werden, und welche Zeile Scans durchgeführt werden. Das Ziel ist es, die Anzahl von Zeilenscans (dh die Datenbank Suche Zeile für Zeile für Werte).
zu reduzierenSie mögen die Subqueries einen nach dem anderen, um zu versuchen, um zu sehen, die man am langsamsten ist.
Diese Abfrage:
SELECT MAX(updated)
FROM pages
WHERE visible = "y"
GROUP BY slug
Macht es das Ergebnis von Slug sortieren. Dies ist wahrscheinlich langsam.