MySQL中INDEX,PRIMARY,UNIQUE,FULLTEXT之间的区别?


Answers:


674

差异性

  • KEYINDEX是指普通的非唯一索引。允许使用索引的非唯一值,因此索引的所有列中可能包含具有相同值的行。这些索引不会对您的数据施加任何限制,因此它们仅用于访问-快速访问某些记录范围而无需扫描所有记录。

  • 独特引用索引,其中索引的所有行都必须是唯一的。也就是说,对于该索引中的所有列,同一行可能不具有与另一行相同的非NULL值。除了用于快速达到某些记录范围外,UNIQUE索引还可以用于对数据施加约束,因为数据库系统不允许在插入或更新数据时打破唯一值规则。

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

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

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

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

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

相似之处

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

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


2
这是否意味着如果您在查询中不使用MATCH()/ AGAINST(),则FULLTEXT索引本质上是没有用的,并且空间很大吗?
user1397417 2014年

5
是。它还仅用于MySQL上的MyISAM数据库,而不用于InnoDB。其他数据库服务器可能具有等效的功能,它们的工作方式可能有所不同。
thomasrutter

“不应在任何允许NULL值的列上使用它”->应当“不能使用”。主键是必需的NOT NULLshow columns如果未定义其他主键,则MySQL将报告非空唯一键是主键。
Gordon Linoff 2014年

1
这里的基本原理是认为NULL不等于自身。..哈哈,我不会忘记这一点
Hos Mercury

2
@thomasrutter MySQL从5.6版本开始支持InnoDB中的FULLTEXT
Marek Skiba

151

所有这些都是指数。

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

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

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

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


32
在MySQL(和许多其他DB)中,主数据库可以是复合的,即多键的。它们只是一个特殊的索引。Unique并不是真正的索引,它是一个约束(确实需要索引在合理的时间内执行,因此创建了一个)。
MBCook

19

我觉得这已经很好地涵盖了,也许除了以下几点:

  • 如果选择性足够,简单的KEY/ INDEX(或称为SECONDARY INDEX)确实会提高性能。在此问题上,通常的建议是,如果在其中应用了索引的结果集中的记录量超过了父表的记录总数的20%,则该索引将无效。实际上,每种体系结构都会有所不同,但是这个想法仍然是正确的。

  • 次要索引(并且非常特定于mysql)不应被视为与主键完全独立且不同的对象。实际上,两者应结合使用,并且一旦知道了这些信息,便可以为mysql DBA提供一个附加工具:在Mysql中,索引嵌入了主键。它带来了显着的性能改进,特别是在巧妙地构建隐式覆盖索引(如此处所述)时

  • 如果您觉得自己的数据应该是UNIQUE,请使用唯一索引。您可能认为它是可选的(例如,在应用程序级别进行操作),并且可以使用普通索引,但是实际上它代表了Mysql的保证,即每一行都是唯一的,这顺便提供了性能上的好处。

  • 您只能将Innodb(在MySQL 5.6.4及更高版本中)和Myisam引擎一起使用FULLTEXT(或称为SEARCH INDEX

  • 您只能使用FULLTEXTCHARVARCHARTEXT列类型
  • FULLTEXT索引不仅涉及创建索引,还涉及很多。创建了一堆系统表,一个完全独立的缓存系统,并应用了一些特定的规则和优化。参见http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.