如何使用will_paginate避免表扫描?

时间:2013-10-25 02:46:11

标签: sql ruby-on-rails sqlite will-paginate

我正在使用will_paginate从表中获取前10-20行,但我发现它产生的简单查询是扫描整个表。

sqlite> explain query plan 
SELECT "deals".* FROM "deals" ORDER BY created_at DESC LIMIT 10 OFFSET 0;
0|0|0|SCAN TABLE deals (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY

如果我使用的是WITH子句和索引,我相信它会有所不同,但这只是在网站首页上显示最新帖子。我确实在这里发现了一两个帖子,建议添加索引,但我不知道它如何帮助进行表扫描。

sqlite> explain query plan 
SELECT deals.id FROM deals ORDER BY id DESC LIMIT 10 OFFSET 0;
0|0|0|SCAN TABLE deals USING INTEGER PRIMARY KEY (~1000000 rows)

这似乎是一个常见的用例,那么它通常如何有效地完成?

1 个答案:

答案 0 :(得分:0)

ORDER BY created_at DESC要求数据库搜索整个表中的最大值。

要加快此搜索速度,您需要created_at列上的索引。