0

对不起,一个神秘的标题......我的问题:

我有一个 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是自动递增的主键,我认为应该有一个优雅的解决方法来解决我的问题。有没有?

4

1 回答 1

0

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

例如:

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

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

如果性能真的那么重要,我会通过创建另一个表或前 50 个结果的缓存并保持单独更新来对数据进行反规范化。

于 2013-09-16T22:44:22.580 回答