如何在不使用索引的情况下选择最后N行

时间:2011-12-29 04:10:39

标签: mysql optimization

我的查询包含几个从 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行很可能包含更新的数据。

2 个答案:

答案 0 :(得分:2)

你走了。请记住,将ORDER BY与任何索引列一起使用应该没有问题,包括id

SET @seq:=0;
SELECT  `id` 
FROM (

SELECT @seq := @seq +1 AS  `seq` ,  `id` 
FROM  `Table` 
WHERE `condition` =  'whatever'
)t1
WHERE t1.seq
BETWEEN (
(

SELECT COUNT( * ) 
FROM  `Table` 
WHERE `condition` =  'whatever'
) -49
)
AND (

SELECT COUNT( * ) 
FROM  `Table` 
WHERE `condition` =  'whatever'
);

您可以使用以下表达式替换“-49”:-1 *($ quantity_desired -1);

另请查看此答案,因为它可能会对您有所帮助: https://stackoverflow.com/a/725439/631764

这是另一个: https://stackoverflow.com/a/1441164/631764

答案 1 :(得分:1)

使用之间:

抓取最后几行
SELECT columns 
FROM Table 
WHERE conditions = 'conditions'
AND id between (select max(id) from table) - 50 AND (select max(id) from table)
ORDER BY id
DESC LIMIT N;

此示例获取最后50行,但将有效地使用id索引。其他条件和排序将只有50多行。应该是一种享受。