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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top