仅通过查看最后X行来优化SQL查询(不仅仅是LIMIT)

时间:2013-08-07 10:42:10

标签: mysql sql

我想在一个非常大的表上执行SQL查询。但是,我只需要查看最后100,000行。目前:

SELECT * FROM bigtable WHERE columna='foobar' ORDER BY id DESC LIMIT 10 

我想做同样的事情,但只能看看最后的X ID。

编辑:首先选择100k行然后从中选择它不是解决方案。即使已找到超过10个所需行,也会选择之前的100k行。这会让它变慢。

3 个答案:

答案 0 :(得分:4)

尝试

select * from 
(
  SELECT * 
  FROM bigtable 
  ORDER BY id DESC
  LIMIT 100000
) x
where columna = 'foobar' 
order by id desc
limit 10

SQLFiddle demo

如果您的查询速度很慢,请在columna上添加索引。

答案 1 :(得分:1)

bigtable(columna, id)上创建综合索引。

MySQL应该足够聪明,可以在索引中查找columna中的值,并按第二个键查找排序。这在documentation

中有解释

答案 2 :(得分:0)

在数据库中,您无法执行检查“最后x行”的查询。关系数据库不保证行以特定顺序物理存储。因此SQL不允许您表达这一点。如果您可以根据行中包含的数据将其转换为实际约束,那么就可以实现。

举个例子,数据库必须做的最糟糕的操作是返回数据之前的完整结果集。这与limit子句无关,因为只有在遍历所有行并对它们进行排序后才知道哪些行具有最高的ID。

但是,如果存在具有columnaid的索引,则按此顺序,数据库引擎应该使用已排序的索引来完成行更快,导致响应时间更快。