创建 MySQL 表时,PRIMARY、UNIQUE、INDEX 和 FULLTEXT 有什么区别?
我将如何使用它们?
KEY或INDEX指的是普通的非唯一索引。索引的非不同值是允许的,因此索引可能包含在索引的所有列中具有相同值的行。这些索引不会对您的数据实施任何限制,因此它们仅用于访问 - 用于快速到达特定范围的记录而无需扫描所有记录。
UNIQUE是指索引的所有行都必须唯一的索引。也就是说,对于该索引中的所有列,同一行可能不会与另一行具有相同的非 NULL 值。除了用于快速达到某些记录范围外,UNIQUE 索引还可用于对数据实施约束,因为数据库系统不允许在插入或更新数据时破坏不同值规则。
您的数据库系统可能允许将 UNIQUE 索引应用于允许 NULL 值的列,在这种情况下,如果两行都包含 NULL 值,则允许它们相同(这里的基本原理是 NULL 被认为不等于自身)。但是,根据您的应用程序,您可能会发现这是不可取的:如果您希望阻止这种情况,您应该在相关列中禁止 NULL 值。
PRIMARY的作用与 UNIQUE 索引完全一样,只是它始终命名为“PRIMARY”,并且一张表上可能只有一个(并且应该始终有一个;尽管某些数据库系统不强制执行此操作)。PRIMARY 索引旨在作为唯一标识表中任何行的主要手段,因此与 UNIQUE 不同,它不应用于任何允许 NULL 值的列。您的 PRIMARY 索引应位于足以唯一标识行的最少列数上。通常,这只是一个包含唯一自动递增数字的列,但如果还有其他可以唯一标识一行的内容,例如国家列表中的“国家代码”,您可以使用它来代替。
一些数据库系统(例如 MySQL 的 InnoDB)会按照它们在 PRIMARY 索引中出现的顺序将表的记录存储在磁盘上。
FULLTEXT索引与上述所有索引都不同,它们的行为在数据库系统之间存在显着差异。FULLTEXT 索引仅对使用 MATCH() / AGAINST() 子句完成的全文搜索有用,这与上述三个不同 - 通常在内部使用 b-trees 实现(允许从最左边的列开始选择、排序或范围)或哈希表(允许从最左边的列开始选择)。
在其他索引类型是通用的地方,一个 FULLTEXT 索引是专门的,因为它服务于一个狭窄的目的:它只用于“全文搜索”功能。
所有这些索引中可能包含多于一列。
除了 FULLTEXT 之外,列顺序很重要:要使索引在查询中有用,查询必须使用从左侧开始的索引中的列 - 它不能只使用索引的第二、第三或第四部分索引,除非它还使用索引中的先前列来匹配静态值。(要使 FULLTEXT 索引对查询有用,查询必须使用索引的所有列。)
所有这些都是指数的种类。
primary:必须是唯一的,是一个索引,是(可能)物理索引,每个表只能是一个。
独特的:正如它所说。这个值的元组不能超过一行。请注意,由于唯一键可以超过一列,这并不一定意味着索引中的每个单独的列都是唯一的,而是这些列中的每个值组合都是唯一的。
index:如果它不是主要的或唯一的,它不会限制插入到表中的值,但它确实允许更有效地查找它们。
fulltext:一种更专业的索引形式,允许全文搜索。将其视为(本质上)为指定列中的每个“单词”创建一个“索引”。
我觉得这已经很好地涵盖了,也许除了以下内容:
如果选择性足够,简单KEY
/ INDEX
(或称为)确实会提高性能。SECONDARY INDEX
关于这个问题,通常的建议是,如果应用了索引的结果集中的记录数量超过了父表记录总数的 20%,那么索引将失效。在实践中,每种架构都会有所不同,但这个想法仍然是正确的。
二级索引(这是 mysql 特有的)不应被视为与主键完全分离且不同的对象。事实上,两者都应该联合使用,一旦知道了这些信息,就可以为 mysql DBA 提供一个额外的工具:在 Mysql 中,索引嵌入了主键。它带来了显着的性能改进,特别是在巧妙地构建隐式覆盖索引时,例如那里描述的。
如果您觉得您的数据应该是UNIQUE
,请使用唯一索引。您可能认为它是可选的(例如,在应用程序级别解决)并且普通索引就可以,但它实际上代表了对 Mysql 的保证,即每一行都是唯一的,这顺便提供了性能优势。
您只能在 Innodb(在 MySQL 5.6.4 及更高版本中)和 Myisam 引擎中使用FULLTEXT
(或以其他方式调用)SEARCH INDEX
您只能使用FULLTEXT
onCHAR
和VARCHAR
columnTEXT
类型
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