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

时间:2009-04-02 00:32:31

标签: mysql indexing key schema

创建MySQL表时PRIMARY,UNIQUE,INDEX和FULLTEXT有什么区别?

我将如何使用它们?

3 个答案:

答案 0 :(得分:631)

差异

  • 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之外,列顺序很重要:要使索引在查询中有用,查询必须使用从左侧开始的索引中的列 - 它不能仅使用第二个,索引的第三或第四部分,除非它还使用索引中的前一列来匹配静态值。 (要使FULLTEXT索引对查询有用,查询必须使用索引的所有列。)

答案 1 :(得分:144)

所有这些都是各种指数。

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

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

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

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

答案 2 :(得分:15)

我觉得这已被很好地覆盖,可能除了以下内容:

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

  • 不应将辅助索引(并且非常特定于mysql)视为与主键完全独立且不同的对象。实际上,两者都应该联合使用,一旦知道这些信息,就为mysql DBA提供了一个额外的工具:在Mysql中,索引嵌入了主键。它可以显着提高性能,特别是在巧妙构建隐式覆盖索引时,例如described there

  • 如果您认为自己的数据应为UNIQUE,请使用唯一索引。您可能认为它是可选的(例如,在应用程序级别进行处理)并且普通索引可以执行,但它实际上代表了Mysql的每一行都是唯一的保证,这偶然提供了性能优势。

  • 您只能对Innodb使用FULLTEXT(或以其他方式称为SEARCH INDEX)(在MySQL 5.6.4及更高版本中)和Myisam Engines

  • 您只能在FULLTEXTCHARVARCHAR列类型上使用TEXT
  • 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
相关问题