1

我目前正在对 jsPerf 使用以下查询。在可能的情况下,您不知道 jsPerf — 有两个表:pages包含测试用例/修订版,以及tests包含测试用例中测试的代码片段。

中目前有 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

您可能想一次尝试一个子查询,看看哪个最慢。

这个查询:

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

使其按 slug 对结果进行排序。这可能很慢。

于 2010-08-25T17:56:55.420 回答