分析项

primary:必须唯一,是一个索引,是(可能是)物理索引,每个表只能有一个。

unique:正如它所说。 具有该值的元组的行不能超过一个。 请注意,由于唯一键可以超过一列,这并不一定意味着索引中的每个单独列都是唯一的,但是这些列中值的每种组合都是唯一的。

index:如果它不是主要的或唯一的,则不会约束插入表中的值,但确实可以更有效地查找它们。

FULLTEXT:索引的一种更专业的形式,允许全文搜索。 将其视为(本质上)为指定列中的每个“单词”创建一个“索引”。

差异性


KEY或INDEX是指普通的非唯一索引。允许使用索引的非唯一值,因此索引的所有列中可能包含具有相同值的行。这些索引不会对您的数据施加任何限制,因此仅用于确保某些查询可以快速运行。

UNIQUE引用索引,其中索引的所有行都必须是唯一的。也就是说,对于该索引中的所有列,同一行可能不具有与另一行相同的非NULL值。除了用于加快查询速度外,UNIQUE索引还可用于对数据施加约束,因为数据库系统不允许在插入或更新数据时破坏此不同值规则。

您的数据库系统可能允许将UNIQUE索引应用于允许NULL值的列,在这种情况下,如果两行都包含NULL值,则允许两行相同(此处的理由是NULL被视为不等于其自身)。但是,根据您的应用程序,您可能会发现这种情况不受欢迎:如果希望防止这种情况,则应在相关列中禁止使用NULL值。

PRIMARY的行为与UNIQUE索引完全一样,只是它始终被命名为'PRIMARY',并且表上可能只有一个(并且应该总是一个;尽管某些数据库系统不强制执行此操作)。 PRIMARY索引旨在作为唯一标识表中任何行的主要手段,因此与UNIQUE不同,不应在允许NULL值的任何列上使用它。您的PRIMARY索引应位于足以唯一标识一行的最少列数上。通常,这只是一列,其中包含一个唯一的自动递增的数字,但是,如果还有其他任何东西可以唯一地标识一行,例如国家列表中的“国家/地区代码”,则可以改用它。

某些数据库系统(例如MySQL的InnoDB)会将表的记录存储在磁盘上,顺序是它们出现在PRIMARY索引中的顺序。

FULLTEXT索引与上述所有索引均不同,并且它们的行为在数据库系统之间也存在很大差异。 FULLTEXT索引仅对使用MATCH()/ AGAINST()子句进行的全文搜索有用,与上述三个不同(通常在内部使用b树(允许从最左列开始进行选择,排序或范围选择)实现)哈希表(允许从最左边的列开始选择)。

在其他索引类型是通用索引的情况下,FULLTEXT索引是专用的,因为它具有狭窄的用途:仅用于“全文搜索”功能。

相似性

所有这些索引中可能都包含不止一列。

除FULLTEXT外,列顺序很重要:要使索引在查询中有用,查询必须使用从左开始的索引中的列-它不能仅使用索引的第二,第三或第四部分 索引,除非它也使用索引中的前几列来匹配静态值。 (为使FULLTEXT索引对查询有用,该查询必须使用索引的所有列。)