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

wxs*_*wxs 3 database sqlite optimization

我有一个简单的SQLite数据库,我正在执行批量,性能敏感的读取.它的架构看起来像这样

CREATE TABLE test (id INTEGER PRIMARY KEY, idB INTEGER, category INTEGER);
Run Code Online (Sandbox Code Playgroud)

我按照增加的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)
...
Run Code Online (Sandbox Code Playgroud)

我在idB和类别列上都放了索引.我发现这个查询:

SELECT * FROM test WHERE category = 1 ORDER BY idB ASC;
Run Code Online (Sandbox Code Playgroud)

比这个查询慢一点

SELECT * FROM test WHERE category = 1 ORDER BY rowid ASC;
Run Code Online (Sandbox Code Playgroud)

我假设是因为SQLite知道数据库是按照增加rowid的顺序存储的,但是不知道它也恰好按照增加的id的顺序存储.这对我的应用程序来说很好,但我想知道rowid的这个排序是否保证比其他索引列更快?也就是说,SQLite是否会一直选择按有序rowid存储其数据库,这样rowID的排序总是很快?

Ben*_*Ben 7

没有任何保证.

但是,文档说明排序会更快(我的重点):

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

并且在您声明时存储行:

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