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

时间:2010-07-31 18:18:01

标签: sqlite indexing primary-key

如果在SQLite表中将整数列标记为主键,是否应该为其显式创建索引? SQLite似乎不会自动为主键列创建索引,但考虑到其目的,它可能无论如何都要对其进行索引? (我将一直在搜索该栏目。)

字符串主键的情况会有什么不同吗?

4 个答案:

答案 0 :(得分:132)

It does it for you.

  

除了INTEGER PRIMARY KEY列外,还有UNIQUE和PRIMARY KEY   通过在数据库中创建索引来实现约束(in   与“CREATE UNIQUE INDEX”语句相同的方式。这样的   index与数据库中的任何其他索引一样用于优化   查询。结果,往往没有优势(但很重要   开销)在已经存在的一组列上创建索引   共同受制于UNIQUE或PRIMARY KEY约束。

答案 1 :(得分:12)

如果一列被标记为INTEGER PRIMARY KEY,那么它实际上比通过指定任何其他PRIMARY KEY或索引值的类似搜索快两倍。这是因为:

  

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

     

如下所示,如果一个rowid表有一个主键由一个列组成,并且该列的声明类型是大写和小写的任何混合的“INTEGER”然后该列成为rowid的别名。

     

这样的列通常被称为“整数主键”。一个   如果声明,则PRIMARY KEY列仅变为整数主键   类型名称正好是“INTEGER”。其他整数类型名称,如“INT”或   “BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”导致主要   键列表现为具有整数亲和性的普通表列   和唯一索引,而不是rowid的别名。

请参阅:http://www.sqlite.org/lang_createtable.html#rowid

答案 2 :(得分:8)

数据库将始终以静默方式为唯一主键创建索引,以便内部检查它是否有效。

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

当然,它不会始终是群集的,如果您希望它通常在架构中指定。

答案 3 :(得分:1)

使用时

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

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

确实,doc 声明:

<块引用>

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

also

<块引用>

如果一个 [...] 表有一个由单列组成的主键,并且该列的声明类型是“INTEGER”[...],那么该列将成为 rowid 的别名

由于 a 是行 ID,不需要索引,由于 B 树结构,列 a 上的查询会很快:

<块引用>

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


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