SQLite中的主键是否需要索引?
当一个整数列被标记为SQLite表中的主键时,是否应该为它明确创build一个索引? SQLite似乎没有自动创build一个主键列索引,但也许它索引呢,因为它的目的? (我会一直在那个专栏上search)。
string主键的情况会不同吗?
它为你做。
除了INTEGER PRIMARY KEY列之外,UNIQUE和PRIMARY KEY约束都是通过在数据库中创build一个索引来实现的(就像“CREATE UNIQUE INDEX”语句一样)。 这样的索引像数据库中的任何其他索引一样用于优化查询。 因此,在一组列上创build索引时,通常没有任何优势(但是开销很大),这些列已经集体受到UNIQUE或PRIMARY KEY约束。
一个数据库总是会默默地为一个唯一的主键创build一个索引,所以它可以在内部检查它是唯一有效的。
创build它之后,它将在必要时使用它。
当然,它不会总是聚集在一起,而且如果您希望的话,通常在模式中指定。
如果一列被标记为INTEGER PRIMARY KEY,实际上其大约是通过指定任何其他PRIMARY KEY或索引值进行的类似search的两倍 。 这是因为:
… SQLite表中的所有行都有一个64位有符号整数键,用于唯一标识其表中的行…使用特定的rowid或具有指定范围内的rowid的所有loggingsearchlogging约为快速通过指定任何其他PRIMARY KEY或索引值进行类似的search。
有一个例外如下所示,如果rowid表的主键由单个列组成,并且该列的声明types是大写和小写混合的“INTEGER” , 则该列将成为rowid的别名。
这样的列通常被称为“整数主键”。 如果声明的types名称完全是“INTEGER”,则PRIMARY KEY列只能成为整数主键。 其他整数types名称(如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)会导致主键列的行为与具有整数关联和唯一索引的普通表列不同,而不是rowid的别名。
请参阅: http : //www.sqlite.org/lang_createtable.html#rowid