【发布时间】:2014-09-10 14:26:14
【问题描述】:
我有一个简单的 SQLite 数据库,我正在对它执行批量、性能敏感的读取。它的架构是这样的
CREATE TABLE test (id INTEGER PRIMARY KEY, idB INTEGER, category INTEGER);
我按照 idB 递增的顺序从每个类别中插入元素,因此 (idB, category) 插入的序列可能如下所示:
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(0, 1)
(1, 1)
(2, 1)
(0, 2)
(1, 2)
(2, 2)
(3, 2)
...
我在 idB 和类别列上都设置了索引。我发现这个查询:
SELECT * FROM test WHERE category = 1 ORDER BY idB ASC;
比这个查询慢一些
SELECT * FROM test WHERE category = 1 ORDER BY rowid ASC;
我假设是因为 SQLite 知道数据库是按 rowid 递增的顺序存储的,但不知道它也恰好是按 id 递增的顺序存储的。这对我的应用程序来说很好,但我想知道 这种按 rowid 的排序是否保证比其他索引列更快?也就是说,SQLite 会始终选择按有序的 rowid 存储其 DB,这样按 rowID 的排序总是很快吗?
【问题讨论】:
-
如有疑问,
EXPLAIN QUERY PLAN <your query here>可以为您提供粗略的指导。 -
是的,在这种情况下,它清楚地说明了为什么使用
rowid排序更快,因为当使用另一个 id 排序时,它在索引阶段有第二次显式排序,但它没有rowid案例。我想知道这是否得到保证。
标签: database sqlite optimization