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


130

当将整数列标记为SQLite表中的主键时,是否也应为其显式创建索引?SQLite似乎没有自动为主键列创建索引,但是给定目的,它还是可以为它建立索引吗?(我将一直在该列上进行搜索)。

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

Answers:


148

它为你做。

除了INTEGER PRIMARY KEY列外,UNIQUE和PRIMARY KEY约束都通过在数据库中创建索引来实现(与“ CREATE UNIQUE INDEX”语句的方式相同)。像数据库中的任何其他索引一样,使用这种索引来优化查询。结果,在已经集体受到UNIQUE或PRIMARY KEY约束的一组列上创建索引时,通常没有任何优势(但是开销很大)。


8
实际上,它说:“ PRIMARY KEY属性通常在指定为PRIMARY KEY的一个或多个列上创建UNIQUE索引”。但是,该索引在SQLite管理应用程序中不可见,这就是我问的原因。
MarekJedliński2010年

1
sqlite_master表格中提到的名称以开头sqlite_autoindex_
2010年

2
晚了,但是@NicolasZozol是的,如果不存在父/引用字段,则需要在其上创建UNIQUE索引(或UNIQUE约束);它是建议孩子/引用字段(S)有一个索引(这通常不会是唯一的):在这里看到的
TripeHound

2
嗯,SQL Data Constraints 这里的部分说:在大多数情况下,UNIQUE和PRIMARY KEY约束是通过在数据库中创建唯一索引来实现的。(例外是WITHOUT ROWID表上的INTEGER PRIMARY KEY和PRIMARY KEY。)那么答案并不总是正确的吗?
好玩的好奇心,2016年

3
似乎对rowid进行了索引,但实现方式不同sqlite.org/lang_createtable.html#rowid rowid表的数据存储为B-Tree结构,其中每个表行均包含一个条目,并使用rowid值作为键...对于具有特定rowid的记录...的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。
matreshkin'8

15

如果将列标记为INTEGER PRIMARY KEY,则实际上它的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。这是因为:

... SQLite表中的所有行都有一个64位带符号整数键,可唯一标识其表中的行...搜索具有特定rowid的记录,或搜索具有指定范围内的rowid的所有记录的时间大约是原来的两倍。与通过指定任何其他PRIMARY KEY或索引值进行的类似搜索一样快。

除了下面提到的一个例外,如果rowid表的主键由单个列组成,并且该列的声明类型为大写和小写的“ INTEGER”则该列将成为rowid的别名。

此类列通常称为“整数主键”。仅当声明的类型名称恰好是“ INTEGER”时,PRIMARY KEY列才成为整数主键。其他整数类型名称(例如“ INT”或“ BIGINT”或“ SHORT INTEGER”或“ UNSIGNED INTEGER”)会导致主键列的行为与具有整数相似性和唯一索引的普通表列相同,而不是作为rowid的别名。

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


8

数据库将始终以静默方式为唯一的主键创建索引,以便它可以在内部有效地检查其唯一性。

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

当然,它不会总是群集的,如果需要,通常在模式中指定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.