对于一个神秘的标题感到抱歉......我的问题:
我有一个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
是自动递增主键我认为应该有一个优雅的解决我的问题。有没有?
答案 0 :(得分:0)
SOME_CONDITIONS 是否可以为查询提供ID范围?至少,您可以限制在排序之前添加到临时表中的行数。
例如:
SELECT * FROM table
WHERE _SOME\_CONDITIONS_
AND id BETWEEN 1 AND 50;
或者,如果 SOME_CONDITIONS 阻止您对结果中的ID范围做出这种假设,则可以使用嵌套查询来提供最小和最大ID。
如果性能非常重要,我会通过创建前50个结果的另一个表或缓存并使其单独更新来对数据进行去规范化。