区别索引,主,唯一,全文在MySQL?

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

我该如何使用它们?

343006 次浏览

所有这些都是指标。

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

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

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

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

差异

  • 关键指数指的是一个普通的非唯一索引。允许索引的值不不同,因此索引五月包含索引的所有列中值相同的行。这些索引不会对您的数据施加任何限制,因此它们仅用于访问—用于快速到达特定范围的记录而不扫描所有记录。

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

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

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

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

  • 全文索引与上述所有索引都不同,它们的行为在不同的数据库系统之间有显著差异。FULLTEXT索引只对使用MATCH() / AGAINST()子句完成的全文搜索有用,不像上面三个——它们通常在内部使用b-树(允许从最左边的列开始选择、排序或范围)或哈希表(允许从最左边的列开始选择)实现。

    其他索引类型都是通用的,而FULLTEXT索引则是专门的,因为它只服务于一个狭窄的目的:它只用于“全文搜索”。特性。

相似之处

  • 所有这些索引都可以有一个以上的列。

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

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

  • 如果选择性足够,简单的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.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html