1

現在、jsPerf に対して次のクエリを使用しています。jsPerf を知らない可能性が高い -pagesテスト ケース / リビジョンを含むテーブルとtests、テスト ケース内のテストのコード スニペットを含むテーブルが 2 つあります。

現在、 には 937 レコード、pagesには 3817 レコードがありtestsます。

ご覧のとおり、このクエリが使用されている「Browse jsPerf」ページをロードするにはかなりの時間がかかります。

クエリの実行には約 7 秒かかります。

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

WHERE句に表示されるすべてのフィールドにインデックスを追加しました。もっと追加する必要がありますか?

このクエリを最適化するにはどうすればよいですか?

PS PHP でキャッシング システムを実装できることはわかっています — おそらく実装するので、教えないでください :) このクエリをどのように改善できるかを知りたいだけです。

4

3 に答える 3

1

EXPLAINの使い方を学びたい。これにより、sqlステートメントが実行され、使用されているインデックスと実行されている行スキャンが表示されます。目標は、行スキャンの数を減らすことです(つまり、データベースが行ごとに値を検索します)。

于 2010-08-25T18:01:43.550 に答える
1

使用する:

   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
于 2010-08-25T18:02:50.920 に答える
0

サブクエリを一度に1つずつ試して、どれが最も遅いかを確認することをお勧めします。

このクエリ:

SELECT MAX(updated)
  FROM pages
  WHERE visible = "y"
  GROUP BY slug

結果をスラッグでソートします。これはおそらく遅いです。

于 2010-08-25T17:56:55.420 に答える