此查询的目的是像搜索一样行事。不幸的是,查询当前运行时间为1.5到2秒,这是不可接受的。在查询上运行EXPLAIN后,我看到它正在使用“使用临时;使用filesort”而没有索引。但是,我不确定在哪里可以为此查询添加索引。
ORDER BY也会慢慢减慢查询速度但是需要它。 有关如何改进此查询的任何建议吗?
SELECT DISTINCT p.id, p.date,
(
SELECT COUNT(post_id) FROM post_tags WHERE post_id = pt.post_id
) as t_count
FROM post_tags pt
INNER JOIN posts p
ON (pt.post_id = p.id)
WHERE pt.t_id IN (7,456)
ORDER BY t_count, p.s_count DESC, p.id DESC
LIMIT 0, 50;
以下是EXPAIN声明:https://gist.github.com/e742982e435cf082c033
答案 0 :(得分:0)
重写为:
SELECT p.id
, p.date
, COUNT(*) AS t_count
FROM posts p
INNER JOIN post_tags pts
ON pts.post_id = p.id
WHERE EXISTS
( SELECT *
FROM post_tags pt
WHERE pt.post_id = p.id
AND pt.t_id IN (7,456)
)
GROUP BY p.id
ORDER BY t_count, p.s_count DESC, p.id DESC
LIMIT 0, 50 ;
答案 1 :(得分:0)
如果您看到“使用临时”;在你的遗嘱中,这通常意味着你没有为你的“命令”或其他操作留下记忆。
对于这个查询,我认为你的my.conf增加了
sort_buffer_size=128M