SQLite 中的主键是否需要索引?

当一个整数列被标记为 SQLite 表中的主键时,是否也应该为它显式创建索引?SQLite 似乎不会自动为主键列创建索引,但是鉴于其用途,它可能还是会为主键列创建索引?(我会一直在这个专栏上搜索)。

对于字符串主键,情况会有什么不同吗?

48672 次浏览

对你来说就是这样。

除了 INTEGERPRIMARYKEY 列之外,还有 UNIQUE 和 PRIMARYKEY 列 约束是通过在数据库中创建索引来实现的(在 与“ CREATEUNIQUEINDEX”语句相同) Index 与数据库中的任何其他索引一样用于优化 查询。因此,往往没有优势(但显着 开销) ,以便在一组已经 集体受到 UNIQUE 或 PRIMARYKEY 约束。

数据库总是默默地为唯一的主键创建索引,以便能够有效地在内部检查它是否唯一。

创建了它之后,它将在必要时使用它。

当然,它不会总是被集群化,如果希望集群化,通常可以在模式中指定。

如果一个列被标记为 INTEGER PRIMARY KEY,它实际上是围绕 比指定任何其他 PRIMARYKEY 或索引值进行类似搜索快一倍的,这是因为:

... SQLite 表中的所有行都有一个64位有符号整数键,它唯一地标识其表中的行... 搜索具有特定 rowid 的记录,或者搜索具有指定范围内的 rowids 的所有记录的速度大约是指定任何其他 PRIMARY KEY 或索引值的类似搜索速度的两倍。

除了下面提到的一个例外,如果 rowid 表有一个主键,那么 由一个列组成,该列的声明类型为“ INTEGER”在任何大小写混合的情况下都是 这个列就变成了 rowid 的别名。

这样的列通常称为“整数主键” 只有在声明的 类型名称正好是“ INTEGER”。其他整数类型名称如“ INT”或 “大”或“短整数”或“无符号整数”导致主要 键列表现为具有整数关联的普通表列 和唯一的索引,而不是 rowid 的别名。

见: http://www.sqlite.org/lang_createtable.html#rowid

使用时

CREATE TABLE data(a INTEGER PRIMARY KEY, b, ...)

传统的附加(隐藏)列 rowid将不存在: 列 a本身 将会是行 id。

实际上,医生指出:

在 SQLite 中,类型为 INTEGER PRIMARYKEY 的列是 ROWID 的 化名(WITHOUT ROWID 表除外) ,ROWID 始终是一个64位有符号整数。

还有

如果一个[ ... ]表有一个由单个列组成的主键,并且该列的声明类型为“ INTEGER”[ ... ] ,那么该列就变成了 一个帮派分子的化名

由于 a是行 id,所以不需要索引,因此由于采用了 B 树结构,对列 a的查询速度将更快:

数据[ ... ]以 B-Tree 结构存储,每个表行包含一个条目,使用 rowid 值作为键。


注意: 我没有引用的[ ... ]部分是关于普通表和带有 WITHOUT ROWID子句的表之间的差异的精度,但是这完全与主题无关。