【发布时间】:2011-12-29 04:10:39
【问题描述】:
我有一个包含多个条件的查询,用于从 500 万 行的表中提取数据。已经建立了一个复合索引来部分覆盖其中一些条件,以至于我无法用索引覆盖排序:
SELECT columns FROM Table WHERE conditions='conditions' ORDER BY id DESC LIMIT N;
id 本身就是一个auto-increment 列。由于使用了filesort,上述查询可能会非常慢(4-5s)。通过删除 ORDER BY 子句,我可以将查询速度提高 4 倍。然而,提取的数据将主要是旧数据。
由于可以对提取的数据进行后处理,因此我更感兴趣的是从结果集中大致最近的 N 行中提取数据。我的问题是,有没有办法做这样的事情:
SELECT columns FROM Table WHERE conditions='conditions' LIMIT -N;
因为我真的不需要排序,而且我知道底部 N 行包含更新数据的可能性很高。
【问题讨论】:
-
您是否使用服务器端语言来构建查询?您可以运行一个只计算行数的查询,然后在限制范围内使用该数字。
-
@Brian Glaz:我正在使用 PHP。是的,我可以先数一数。但这不是花费时间的两倍吗?
-
需要更多时间,是的。但是一个简单的
SELECT COUNT(id) FROM table通常运行得很快。 -
@Brian Glaz,它必须首先检查
where子句中的条件,这需要相当长的时间。
标签: mysql optimization