我目前正在为JSPERF使用以下查询。在可能的情况下,您不知道Jsperf-有两个表: pages 包含测试案例 /修订,以及 tests 包含用于测试案例内测试的代码片段。

目前有937个记录 pages 和3817记录 tests.

如您所见,加载需要一段时间 “浏览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中实现一个缓存系统 - 我可能会,所以请不要告诉我:)我真的很想找出如何改进此查询。

有帮助吗?

解决方案

采用:

   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

其他提示

您想学习如何使用解释。这将执行SQL语句,并向您展示正在使用哪些索引,以及正在执行哪些行扫描。目的是减少行扫描的数量(即,按行搜索值的数据库搜索值)。

您可能需要一次尝试一个子征服,以查看哪个最慢。

此查询:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top