在SQLite中通过rowid排序保证是快速的

时间:2014-07-19 15:46:46

标签: database sqlite optimization

我有一个简单的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的排序总是很快?

1 个答案:

答案 0 :(得分:7)

没有任何东西保证

然而,排序的documentation states会更快(我的重点):

  

rowid表的数据存储为B-Tree结构,包含每个表行的一个条目,使用rowid值作为键。 这意味着按rowid检索或排序记录很快。搜索具有特定rowid的记录,或者搜索指定范围内rowid的所有记录的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。

并且行是stored as you state

  

按行增加rowid的顺序逻辑存储行。