我正在努力最小化
ORDER BY
的开销。我的理解是:
SELECT gorilla, chimp FROM apes ORDER BY bananas DESC LIMIT 10;
在
ORDER BY
之前检索完整的匹配记录集,即使我只想要前十条记录。为了消除这种开销,我考虑以预定义的顺序存储,但这只能在发生插入/删除之前有效(不可行)。
我找到了排序索引:
CREATE INDEX index_name ON apes (bananas DESC);
我假设按降序对索引(而不是表)进行排序,并且在更新后仍然如此。我该如何利用这个?有某种
SELECT FROM index
吗?排序索引是否会按照索引的顺序而不是列的顺序返回结果?或者我完全错过了什么?
我正在使用 SQLite3,由 PHP 7.1 查询。
带有 LIMIT 的 ORDER BY 比普通 ORDER BY 更高效,因为只有前几行需要完全排序。
无论如何,对于单列索引,排序顺序(ASC 或 DESC)是没有意义的,因为 SQLite 可以向前或向后单步遍历索引。
当 SQLite 估计索引有用时,索引会自动使用。 要检查实际发生的情况,请运行 EXPLAIN QUERY PLAN(或在
.eqp on
shell 中设置 sqlite3
)。