关于索引:MySQL中的INDEX,PRIMARY,UNIQUE,FULLTEXT之间的区别?

Differences between INDEX, PRIMARY, UNIQUE, FULLTEXT in MySQL?

在创建mysql表时,primary、unique、index和fulltext有什么区别?

我如何使用它们?


差异

  • 键或索引是指正常的非唯一索引。允许索引的值不唯一,因此索引的所有列中可能包含值相同的行。这些索引不会对数据实施任何限制,因此它们仅用于确保某些查询可以快速运行。

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

    数据库系统可能允许对允许空值的列应用唯一索引,在这种情况下,如果两行都包含空值,则允许两行相同(这里的基本原理是空值被认为不等于其自身)。但是,根据您的应用程序的不同,您可能会发现这是不可取的:如果您希望防止这种情况发生,则应在相关列中不允许使用空值。

  • primary的作用与唯一索引完全相同,只是它始终被命名为"primary",并且一个表上可能只有一个索引(并且应该始终有一个索引;尽管某些数据库系统不强制执行这个索引)。主索引旨在作为唯一标识表中任何行的主要手段,因此与unique不同,它不应用于允许空值的任何列。主索引应该位于足够唯一标识行的最小列数上。通常,这只是包含唯一自动递增数字的一列,但是如果还有其他可以唯一标识行的内容,例如国家列表中的"countrycode",则可以使用它。

    一些数据库系统(比如mysql的innodb)会按照表在主索引中的显示顺序将表的记录存储在磁盘上。

  • 全文索引不同于上述所有索引,并且它们的行为在数据库系统之间存在显著差异。全文索引仅对使用match()/against()子句进行的全文搜索有用,与上述三种方法不同,后者通常在内部使用B-树(允许从最左边的列开始选择、排序或范围)或哈希表(允许从最左边的列开始选择)来实现。

    如果其他索引类型是通用的,则全文索引是专门化的,因为它的用途很窄:它只用于"全文搜索"功能。

相似之处

  • 所有这些索引中可能有多个列。

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


所有这些都是各种指数。

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

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

索引:如果它不是主要的或唯一的,它不会约束插入到表中的值,但是它允许更有效地查找这些值。

全文本:一种更专门的索引形式,允许全文搜索。把它看作(本质上)为指定列中的每个"单词"创建一个"索引"。


我觉得这已经被很好地涵盖了,可能除了以下几点:

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

  • 二级索引(这是MySQL特有的)不应该被视为与主键完全分离和不同的对象。事实上,两者都应该联合使用,一旦知道了这些信息,就为MySQL DBA提供了一个额外的工具:在MySQL中,索引嵌入了主键。它会显著提高性能,特别是在巧妙地构建隐式覆盖索引(如此处所述)时

  • 如果您觉得您的数据应该是UNIQUE,请使用唯一的索引。您可能认为它是可选的(例如,在应用程序级别进行计算),普通索引也可以,但它实际上代表了MySQL的一个保证,即每行都是唯一的,这附带地提供了性能优势。

  • 您只能在innodb(在mysql 5.6.4及更高版本中)和myisam引擎中使用FULLTEXT或其他名称的SEARCH INDEX

  • 只能在CHARVARCHARTEXT列类型上使用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