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

Mar*_*ski 124 sqlite indexing primary-key

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

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

hvg*_*des 137

它为你做到了.

除了INTEGER PRIMARY KEY列之外,UNIQUE和PRIMARY KEY约束都是通过在数据库中创建索引来实现的(与"CREATE UNIQUE INDEX"语句相同).这样的索引与数据库中的任何其他索引一样用于优化查询.因此,在已经集体服务于UNIQUE或PRIMARY KEY约束的一组列上创建索引通常没有优势(但是显着的开销).

  • 实际上,它说"PRIMARY KEY属性通常会在指定为PRIMARY KEY的列上创建一个UNIQUE索引".但是,该索引在SQLite管理应用程序中不可见,这就是我问的原因. (7认同)
  • 它在 `sqlite_master` 表中提到,名称以 `sqlite_autoindex_` 开头。 (3认同)
  • 迟到了,但@NicolasZozol是的你_need_在父/被引用的字段上创建一个`UNIQUE`索引(或者一个`UNIQUE`约束),如果它不存在的话._recommended_,子/引用字段有一个索引(通常不是唯一的):[见这里](https://sqlite.org/foreignkeys.html#fk_indexes) (2认同)
  • 嗯,"SQL数据约束"部分[这里](http://example.com)说:**在大多数情况下**,UNIQUE和PRIMARY KEY约束是通过在数据库中创建唯一索引来实现的.(例外是关于WITHOUT ROWID表的INTEGER PRIMARY KEY和PRIMARY KEY.).所以答案并非总是如此? (2认同)
  • 似乎对rowid进行了索引,但实现方式有所不同https://www.sqlite.org/lang_createtable.html#rowid rowid表的数据存储为B-Tree结构,其中每个表行包含一个条目,使用rowid值作为键...搜索具有特定rowid的记录...的速度大约是通过指定其他任何PRIMARY KEY或索引值进行的相似搜索的两倍。 (2认同)

小智 12

如果一列被标记为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


Cas*_*Cow 8

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

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

当然,它不会始终是群集的,如果您希望它通常在模式中指定.