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

在创buildMySQL表时,PRIMARY,UNIQUE,INDEX和FULLTEXT有什么区别?

我将如何使用它们?

差异

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

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

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

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

    一些数据库系统(例如MySQL的InnoDB)将按照它们出现在PRIMARY索引中的顺序将一张表的logging存储在磁盘上。

  • FULLTEXT索引与以上所有不同,它们在数据库系统之间的行为差​​异很大。 FULLTEXT索引只对使用MATCH()/ AGAINST()子句完成的全文search很有用,与上述三种不同 – 通常在内部使用B树实现(允许从最左列开始select,sorting或范围)或散列表(允许从最左列开始select)。

    在其他索引types是通用目的的情况下,FULLTEXT索引是专用的,因为它具有狭义的目的:它仅用于“全文search”function。

相似

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

  • 除了FULLTEXT之外,列顺序是有意义的:为使索引在查询中有用,查询必须使用索引从左边开始的列 – 它不能只使用索引的第二,第三或第四部分索引,除非它也使用索引中的前一列来匹配静态值。 (要使FULLTEXT索引对查询有用,查询必须使用索引的所有列。)

所有这些都是各种指标。

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

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

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

全文:允许全文search的更专门的索引forms。 把它看作(实质上)为指定的列中的每个“单词”创build一个“索引”。

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

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

  • 二级索引(这是非常特定于MySQL)不应被视为与主键完全分离和不同的对象。 实际上,两者都应该联合使用,并且一旦知道这些信息,就为mysql DBA提供了一个额外的工具:在Mysql中,索引embedded主键。 这导致了显着的性能改进,特别是在巧妙地构build隐含覆盖索引(例如在那里描述的)时

  • 如果您觉得您的数据应该是UNIQUE ,请使用唯一的索引。 你可能会认为它是可选的(例如,在应用程序级别工作),并且正常的索引会做,但它实际上代表了对每一行都是唯一的Mysql的保证,这偶然提供了性能优势。

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

  • 您只能在CHARVARCHARTEXT列types上​​使用FULLTEXT
  • FULLTEXT索引涉及的不仅仅是创build索引。 有一堆创build的系统表,一个完全独立的caching系统和一些特定的规则和优化应用。 请参阅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