Cómo optimizar esta consulta MySQL bajo rendimiento?
-
01-10-2019 - |
Pregunta
Actualmente estoy usando la siguiente consulta para jsPerf. En el caso probable es que no sabe jsPerf - hay dos tablas: pages
que contiene los casos de prueba / revisiones, y tests
que contiene los fragmentos de código para las pruebas dentro de los casos de prueba
Actualmente hay 937 registros en pages
y 3817 registros en tests
.
Como se puede ver, se necesita bastante tiempo para cargar la “Navegar jsPerf” página donde esta consulta se utiliza.
La consulta tarda unos 7 segundos para ejecutar:
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
He añadido índices en todos los campos que aparecen en las cláusulas WHERE
. Debo añadir más?
¿Cómo puede ser optimizado esta consulta?
P.S. Sé que podría implementar un sistema de almacenamiento en caché de PHP -. Probablemente voy, así que por favor no me diga :) me gustaría realmente como para averiguar cómo esta consulta se puede mejorar, también
Solución
Uso:
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
Otros consejos
¿Quieres aprender cómo utilizar explicar. Esto ejecutará la instrucción SQL, y los que se están utilizando índices mostrar, y lo que las exploraciones consecutivas se está realizando. El objetivo es reducir el número de exploraciones de fila (es decir, la base de datos en busca fila por fila para los valores).
Es posible que desee probar las subconsultas uno a la vez para ver cuál es más lento.
Esta consulta:
SELECT MAX(updated)
FROM pages
WHERE visible = "y"
GROUP BY slug
Hace que sea ordenar el resultado por babosa. Esta es probablemente lento.