我想跨一个非常大的表执行 SQL 查询。但是,我只需要查看最后 100,000 行。目前:
SELECT * FROM bigtable WHERE columna='foobar' ORDER BY id DESC LIMIT 10
我想做同样的事情,但让它只在最后的 X ids 中查找。
编辑:首先选择 100k 行然后从中选择它不是解决方案。这会选择完整的前 100k 行,即使已找到超过 10 个所需的行。这让它变慢了。
尝试
select * from
(
SELECT *
FROM bigtable
ORDER BY id DESC
LIMIT 100000
) x
where columna = 'foobar'
order by id desc
limit 10
如果您的查询速度很慢,请在columna
.
在 ) 上创建复合索引bigtable(columna, id
。
MySQL 应该足够聪明,可以columna
在索引中查找值并按第二个键排序。这在文档中进行了解释。
在数据库中,您不能执行检查“最后 x 行”的查询。关系数据库不保证行以特定顺序物理存储。因此 SQL 将不允许您表达这一点。如果您可以根据行中包含的数据将其转换为实际约束,那么这将是可能实现的。
以您的示例为例,数据库必须做的最糟糕的操作是在返回数据之前对完整结果集进行排序。这与limit
子句无关,因为只有在您遍历所有行并对它们进行排序之后,您才知道哪些行具有最高的 id。
但是,如果有一个带有columna
和的索引id
,按照该顺序,数据库引擎应该使用已排序的索引来更快地遍历行,从而加快响应时间。