Come ottimizzare la query MySQL basse prestazioni?
-
01-10-2019 - |
Domanda
Attualmente sto usando la seguente query per jsPerf. Nel caso probabile che non si sa jsPerf - ci sono due tavoli: pages
contenente il casi di test / revisioni, e tests
contenente i frammenti di codice per i test all'interno dei casi di test
Al momento non ci sono 937 record in pages
e 3817 record in tests
.
Come si può vedere, ci vuole un po 'di tempo per caricare “Sfoglia jsPerf” pagina dove questa query viene utilizzato.
La query richiede circa 7 secondi per eseguire:
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
Ho aggiunto gli indici su tutti i campi che compaiono in clausole WHERE
. Devo aggiungere altro?
Come può essere ottimizzato interrogazione?
P.S. So che avrei potuto implementare un sistema di caching in PHP -. Probabilmente farò, quindi per favore non mi dica :) Vorrei solo davvero per scoprire come questa query potrebbe essere migliorata, anche
Soluzione
Usa:
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
Altri suggerimenti
Si desidera imparare a utilizzare spiegare. Questo eseguirà l'istruzione SQL, e che vengono utilizzati indici mostrare, e quali le scansioni fila sono in corso di esecuzione. L'obiettivo è quello di ridurre il numero di scansioni di riga (vale a dire, il database alla ricerca riga per riga per i valori).
Si consiglia di provare le sottoquery uno alla volta per vedere quale è il più lento.
Questa query:
SELECT MAX(updated)
FROM pages
WHERE visible = "y"
GROUP BY slug
Rende ordinare il risultato per slug. Questo è probabilmente lenta.