MySQL通过限制的大表上的主键优化顺序

时间:2013-09-16 22:29:46

标签: mysql optimization

对于一个神秘的标题感到抱歉......我的问题:

我有一个mysql查询,它以最简化的形式显示如下:

SELECT * FROM table 
WHERE _SOME\_CONDITIONS_
ORDER BY `id` DESC
LIMIT 50

如果没有LIMIT子句,查询将返回大约50,000行,但我只对前50行感兴趣。现在我意识到,因为我添加了ORDER BY位,MySQL必须创建一个临时表并加载所有结果,然后订购50,000个结果,然后才能返回前50个结果。

当我比较此查询的效果与不使用ORDER BY的查询时,我得到了1.8秒与0.02秒之间的惊人差异。

鉴于id是自动递增主键我认为应该有一个优雅的解决我的问题。有没有?

1 个答案:

答案 0 :(得分:0)

SOME_CONDITIONS 是否可以为查询提供ID范围?至少,您可以限制在排序之前添加到临时表中的行数。

例如:

SELECT * FROM table 
WHERE _SOME\_CONDITIONS_
AND id BETWEEN 1 AND 50;

或者,如果 SOME_CONDITIONS 阻止您对结果中的ID范围做出这种假设,则可以使用嵌套查询来提供最小和最大ID。

如果性能非常重要,我会通过创建前50个结果的另一个表或缓存并使其单独更新来对数据进行去规范化。