【问题标题】:Is ordering by rowid in SQLite guaranteed to be fast在 SQLite 中按 rowid 排序保证很快
【发布时间】: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


【解决方案1】:

没有什么是永远保证

但是,documentation states 排序会更快(我的重点):

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

那行是stored as you state:

这些行在逻辑上按照rowid递增的顺序存储。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多