如果在SQLite表中将整数列标记为主键,是否应该为其显式创建索引? SQLite似乎不会自动为主键列创建索引,但考虑到其目的,它可能无论如何都要对其进行索引? (我将一直在搜索该栏目。)
字符串主键的情况会有什么不同吗?
答案 0 :(得分:132)
除了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的别名。
答案 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
子句的表之间差异的精度有关,但这完全超出了这里的主题。