【发布时间】: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 列,这在某些情况下可以带来存储和速度优势。