我正试图找到一种方法来加速缓慢(filesort)MySQL查询。
表:
categories (id, lft, rgt)
questions (id, category_id, created_at, votes_up, votes_down)
示例查询:
SELECT * FROM questions q
INNER JOIN categories c ON (c.id = q.category_id)
WHERE c.lft > 1 AND c.rgt < 100
ORDER BY q.created_at DESC, q.votes_up DESC, q.votes_down ASC
LIMIT 4000, 20
如果删除ORDER BY
子句,则速度很快。我知道MySQL不喜欢同一子句中的DESC
和ASC
命令,因此我尝试将复合(created_at, votes_up)
索引添加到questions
表并删除{{1来自q.votes_down ASC
子句。这没有帮助,似乎ORDER BY
子句在这里受到影响,因为它按另一个(WHERE
)表的列进行过滤。但是,即使它起作用,也不是很正确,因为我确实需要categories
条件。
在这种情况下,有哪些改善绩效的好策略?如果可能的话,我宁愿避免重组表。
编辑:
q.votes_down ASC
答案 0 :(得分:1)
尝试使用子查询来获取所需的类别:
SELECT * FROM questions
WHERE category_id IN ( SELECT id FROM categories WHERE lft > 1 AND rgt < 100 )
ORDER BY created_at DESC, votes_up DESC, votes_down ASC
LIMIT 4000, 20
答案 1 :(得分:0)
尝试仅选择查询中所需的内容,而不是SELECT *
答案 2 :(得分:0)
尝试将关于联接表的条件放入ON子句:
SELECT * FROM questions q
INNER JOIN categories c ON (c.id = q.category_id AND c.lft > 1 AND c.rgt < 100)
ORDER BY q.created_at DESC, q.votes_up DESC, q.votes_down ASC
LIMIT 4000, 20