MySQL中INDEX,PRIMARY,UNIQUE,FULLTEXT之间的区别?
创建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-树实现(允许从最左列开始选择,排序或范围)或哈希表(允许从最左列开始选择)。
在其他索引类型是通用目的的情况下,FULLTEXT索引是专用的,因为它具有狭义的目的:它仅用于“全文搜索”功能。
相似
所有这些索引可能有多个列。
除FULLTEXT外,列顺序非常重要:为使索引在查询中有用,查询必须使用索引中从左侧开始的列 - 它不能仅使用索引的第二,第三或第四部分索引,除非它也使用索引中的前几列来匹配静态值。 (要使FULLTEXT索引对查询有用,查询必须使用索引的所有列。)
所有这些都是各种指标。
主要:必须是唯一的,是索引,是(可能)物理索引,每个表只能有一个。
独特的:就像它说的那样。 你不能有多于一行的这个值的元组。 请注意,由于唯一键可以超过一列,所以这并不一定意味着索引中的每个单独列都是唯一的,但是这些列中每个值的组合都是唯一的。
index:如果它不是主要的或唯一的,它不会限制插入到表中的值,但它确实可以更有效地查找它们。
全文:允许全文搜索的更专门的索引形式。 把它看作(基本上)为指定列中的每个“单词”创建一个“索引”。
我觉得这已经被很好的覆盖了,可能除了以下几点:
如果选择性足够,简单的KEY
/ INDEX
(或称为SECONDARY INDEX
)可以提高性能。 在这个问题上,通常的建议是,如果应用索引的结果集中的记录数量超过父表记录总数的20%,那么索引将无效。 在实践中,每个架构都会有所不同,但这个想法仍然是正确的。
二级索引(并且这对于mysql非常具体)不应该被视为与主键完全分离和不同的对象。 实际上,两者都应该联合使用,并且一旦知道这些信息,就可以为mysql DBA提供额外的工具:在Mysql中,索引嵌入主键。 它会显着提高性能,尤其是在巧妙构建隐含覆盖索引(如此处所述)时
如果您觉得您的数据应该是UNIQUE
,请使用唯一的索引。 您可能认为它是可选的(例如,在应用程序级别进行处理),并且正常的索引会执行,但它实际上代表了对每一行都是唯一的Mysql的保证,这偶然提供了性能优势。
您只能使用Innodb(在MySQL 5.6.4及更高版本中)和Myisam引擎的FULLTEXT
(或称为SEARCH INDEX
)
CHAR
, VARCHAR
和TEXT
列类型上使用FULLTEXT
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 上一篇: Differences between INDEX, PRIMARY, UNIQUE, FULLTEXT in MySQL?