【问题标题】:Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLiteCREATE UNIQUE INDEX 或 INTEGER PRIMARY KEY 在 SQLite 中的性能更高吗
【发布时间】:2015-10-24 10:55:25
【问题描述】:

在 SQLite 中,将列指定为 INTEGER PRIMARY KEY 会使该列成为 rowid 的别名,这意味着 SELECT 语句可以非常快,因为它们可以利用存储数据的 B 树结构。

是否通过在列上指定 CREATE UNIQUE INDEX 来实现相同级别的性能?特别是,如果我们在 INTEGER 列上创建 UNIQUE INDEX,SQLite 是否会将该列作为 rowid 的别名,具有相应的性能优势。

按照我目前的看法,指定 INTEGER PRIMARY KEY 至少与 CREATE UNIQUE INDEX 一样好,并且可能更好。

【问题讨论】:

  • ROWID 列是ROWID 列。创建别名的唯一方法是使用'INTEGER PRIMARY KEY';不是唯一索引。
  • 无论如何,ROWID 列(每个 SQLite 表都有)代表数据的物理布局。混叠效果不会改变这一点。当创建不同的主键(不是别名列)时,这实际上是一个单独的(唯一)索引。因此,非别名主键和唯一索引的性能应该相同,而别名“INTEGER PRIMARY KEY”应该快一点,因为数据在查找时立即可用(即,使用主键覆盖所有列)。
  • 谢谢@user2864740。我实际上相信可以通过在创建表时指定 WITHOUT ROWID (docs) 来省略 ROWID 列,这在某些情况下可以带来存储和速度优势。

标签: sql sqlite


【解决方案1】:

documentation 说:

按 rowid 检索或排序记录很快。搜索具有特定 rowid 的记录或具有指定范围内的 rowid 的所有记录的速度大约是通过指定任何其他 PRIMARY KEY 或索引值进行的类似搜索的两倍。

和:

如果 rowid 表的主键由单个列组成,并且该列的声明类型为“INTEGER”(大小写任意混合),则该列将成为 rowid 的别名。

没有其他方法可以使列成为 rowid 的别名。

【讨论】:

  • 感谢您的回复@CL。因此,鉴于 INTEGER PRIMARY KEY 是唯一的别名 rowid 方法,那么我们是否可以推断使用 INTEGER PRIMARY KEY 的表上的 SELECT 语句将比从使用索引构建的表中选择更快,甚至该索引建立在 INTEGER 列上?
  • 仅在最坏的情况下。通常,无论如何,所有内容都在缓存中。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2015-04-22
  • 2010-10-17
  • 2021-12-05
相关资源
最近更新 更多