Mat*_*att 6 mysql sql optimization performance
我使用MySQL为我的网站建立了一个自定义论坛.列表页面本质上是一个包含以下列的表:主题,上次更新和#Reslies.
DB表包含以下列:
id
name
body
date
topic_id
email
Run Code Online (Sandbox Code Playgroud)
一个主题为"0"的topic_id,并回复有自己的母话题的topic_id.
SELECT SQL_CALC_FOUND_ROWS
t.id, t.name, MAX(COALESCE(r.date, t.date)) AS date, COUNT(r.id) AS replies
FROM
wp_pod_tbl_forum t
LEFT OUTER JOIN
wp_pod_tbl_forum r ON (r.topic_id = t.id)
WHERE
t.topic_id = 0
GROUP BY
t.id
ORDER BY
date DESC LIMIT 0,20;
Run Code Online (Sandbox Code Playgroud)
此表中总共有2,100个项目,查询通常需要6秒钟.我在"topic_id"列中添加了一个INDEX,但这没有多大帮助.有没有办法加速这个查询而不进行重大重组?
编辑:还没有完成工作.我似乎无法让下面的例子正常工作.
SELECT id, name, last_reply, replies
FROM (
SELECT topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
FROM wp_pod_tbl_forum
GROUP BY
topic_id
) r
JOIN wp_pod_tbl_forum t
ON t.topic_id = 0
AND t.id = r.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
date DESC
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)
如果您的表是MyISAM或id不是a PRIMARY KEY,则需要创建复合索引(topic_id, id).
如果你的表是InnoDB和id是PRIMARY KEY,那么只需要一个索引(topic_id)(id将隐式添加到索引中).
更新
这个查询很可能会更加有效,前提是你必须对指标(topic_id, id)和(date, id):
有关性能详情,请参阅我的博客中的这篇文章
此查询在行样本数据30 ms上完成100,000:
SELECT id, name, last_reply,
(
SELECT COUNT(*)
FROM wp_pod_tbl_forum fc
WHERE fc.topic_id = fl.topic_id
) AS replies
FROM (
SELECT topic_id, date AS last_reply
FROM wp_pod_tbl_forum fo
WHERE id = (
SELECT id
FROM wp_pod_tbl_forum fp
WHERE fp.topic_id = fo.topic_id
ORDER BY
fp.date DESC, fp.id DESC
LIMIT 1
)
AND fo.topic_id <> 0
ORDER BY
fo.date DESC, fo.id DESC
LIMIT 20
) fl
JOIN wp_pod_tbl_forum ft
ON ft.id = fl.topic_id
UNION ALL
SELECT id, name, date, 0
FROM wp_pod_tbl_forum t
WHERE NOT EXISTS
(
SELECT NULL
FROM wp_pod_tbl_forum r
WHERE r.topic_id = t.id
)
AND t.topic_id = 0
ORDER BY
last_reply DESC, id DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)
这个查询都需要这两个索引才能有效.
如果你的表是InnoDB 和 id是PRIMARY KEY,那么你可以省略indexes上面的id .
| 归档时间: |
|
| 查看次数: |
17269 次 |
| 最近记录: |