慢速查询多个where和order by子句

时间:2012-02-26 12:03:17

标签: mysql performance

我正试图找到一种方法来加速缓慢(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不喜欢同一子句中的DESCASC命令,因此我尝试将复合(created_at, votes_up)索引添加到questions表并删除{{1来自q.votes_down ASC子句。这没有帮助,似乎ORDER BY子句在这里受到影响,因为它按另一个(WHERE)表的列进行过滤。但是,即使它起作用,也不是很正确,因为我确实需要categories条件。

在这种情况下,有哪些改善绩效的好策略?如果可能的话,我宁愿避免重组表。

编辑:

q.votes_down ASC

3 个答案:

答案 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 *

Why not to use SELECT * ( ALL ) in MySQL

答案 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