我有一个简单的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知道DB是按照增加rowid的顺序存储的,但是不知道它也恰好按id增加的顺序存储。这对我的应用程序来说很好,但是我想知道这个rowid的排序是否保证比其他索引列更快?也就是说,SQLite是否会一直选择按有序rowid存储其数据库,这样rowID的排序总是很快?
答案 0 :(得分:7)
没有任何东西保证。
然而,排序的documentation states会更快(我的重点):
rowid表的数据存储为B-Tree结构,包含每个表行的一个条目,使用rowid值作为键。 这意味着按rowid检索或排序记录很快。搜索具有特定rowid的记录,或者搜索指定范围内rowid的所有记录的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。
并且行是stored as you state:
按行增加rowid的顺序逻辑存储行。