创建MySQL表时PRIMARY,UNIQUE,INDEX和FULLTEXT之间有什么区别?
我该如何使用它们?
KEY或INDEX指的是正常的非唯一索引.允许索引的非不同值,因此索引可以包含索引的所有列中具有相同值的行.这些索引不会对您的数据施加任何限制,因此它们仅用于确保某些查询可以快速运行.
UNIQUE指的是索引的所有行必须唯一的索引.也就是说,对于此索引中的所有列,同一行可能不具有与另一行相同的非NULL值.除了用于加速查询之外,UNIQUE索引还可用于强制限制数据,因为数据库系统在插入或更新数据时不允许破坏此不同值规则.
您的数据库系统可能允许将UNIQUE索引应用于允许NULL值的列,在这种情况下,如果两行都包含NULL值,则允许两行相同(这里的基本原理是NULL被认为不等于它自己).但是,根据您的应用程序,您可能会发现这种情况不受欢迎:如果您希望阻止这种情况,则应在相关列中禁止使用NULL值.
PRIMARY的行为与UNIQUE索引完全相同,只是它总是命名为'PRIMARY',并且表中可能只有一个(并且应该总是有一个;尽管某些数据库系统不强制执行此操作).PRIMARY索引旨在作为唯一标识表中任何行的主要方法,因此与UNIQUE不同,它不应在任何允许NULL值的列上使用.您的PRIMARY索引应该位于足以唯一标识行的最小列数上.通常,这只是一个包含唯一自动递增数字的列,但如果还有其他任何可以唯一标识行的列,例如国家/地区列表中的"countrycode",则可以使用该列.
某些数据库系统(例如MySQL的InnoDB)将按照它们在PRIMARY索引中出现的顺序将表记录存储在磁盘上.
FULLTEXT索引与上述所有索引不同,它们的行为在数据库系统之间存在显着差异.FULLTEXT索引仅对使用MATCH()/ AGAINST()子句进行的全文搜索很有用,与上述三种不同 - 通常使用b-tree在内部实现(允许从最左列开始选择,排序或范围)或哈希表(允许从最左侧列开始选择).
在其他索引类型是通用的情况下,FULLTEXT索引是专用的,因为它用于狭窄的目的:它仅用于"全文搜索"功能.
所有这些索引中可能包含多个列.
除了FULLTEXT之外,列顺序很重要:要使索引在查询中有用,查询必须使用从左侧开始的索引中的列 - 它不能仅使用索引的第二,第三或第四部分index,除非它还使用索引中的前一列来匹配静态值.(要使FULLTEXT索引对查询有用,查询必须使用索引的所有列.)
所有这些都是各种指数.
primary:必须是唯一的,是索引,是(可能)物理索引,每个表只能有一个.
独特:正如它所说.您不能有多个具有此值的元组的行.请注意,由于唯一键可以包含多个列,因此这并不一定意味着索引中的每个列都是唯一的,但这些列中每个值的组合都是唯一的.
index:如果它不是主要的或唯一的,它不会约束插入表中的值,但它确实可以更有效地查找它们.
全文:一种更专业的索引形式,允许全文搜索.可以将其视为(基本上)为指定列中的每个"单词"创建"索引".
我觉得这已被很好地覆盖,可能除了以下内容:
如果选择性足够,简单KEY
/ INDEX
(或以其他方式称SECONDARY INDEX
)会提高性能.在这个问题上,通常的建议是,如果应用索引的结果集中的记录数量超过父表记录总量的20%,那么索引将无效.在实践中,每个架构都会有所不同,但这个想法仍然是正确的.
辅助索引(并且非常特定于mysql)不应被视为与主键完全独立且不同的对象.实际上,两者都应该联合使用,一旦知道这些信息,就为mysql DBA提供了一个额外的工具:在Mysql中,索引嵌入了主键.它可以显着提高性能,特别是在巧妙构建隐含覆盖索引时,如此处所述
如果您觉得您的数据应该是UNIQUE
,请使用唯一索引.您可能认为它是可选的(例如,在应用程序级别进行处理)并且普通索引可以执行,但它实际上代表了Mysql的每一行都是唯一的保证,这偶然提供了性能优势.
您只能使用FULLTEXT
(或以其他方式调用SEARCH INDEX
)Innodb(在MySQL 5.6.4及更高版本中)和Myisam Engines
您只能使用FULLTEXT
上CHAR
,VARCHAR
和TEXT
列类型
FULLTEXT
索引涉及的不仅仅是创建索引.创建了一堆系统表,一个完全独立的缓存系统,并应用了一些特定的规则和优化.请参阅http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html和http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html