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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top