如何优化此低性能MySQL查询?
-
01-10-2019 - |
题
我目前正在为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对结果进行排序。这可能很慢。
不隶属于 StackOverflow