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

War es hilfreich?

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 reduzieren

Sie 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top