我正在使用 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)
这似乎是一个常见的用例,那么它通常是如何有效地完成的呢?