我的查询包含几个从 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行很可能包含更新的数据。
答案 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
答案 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多行。应该是一种享受。