在创建MySQL表时,PRIMARY, UNIQUE, INDEX和FULLTEXT之间有什么区别?
我该如何使用它们?
所有这些都是指标。
主:必须是唯一的,是一个索引,(可能)是物理索引,每个表只能有一个。
独特:正如它所说。这个值的元组不能有多行。注意,由于唯一键可以在多个列上,这并不一定意味着索引中的每一列都是唯一的,而是这些列上的每个值组合都是唯一的。
指数:如果它不是主要的或唯一的,它不会约束插入到表中的值,但它允许更有效地查找它们。
全文:是一种更专业的索引形式,允许全文搜索。可以把它看作(本质上)为指定列中的每个“单词”创建一个“索引”。
关键或指数指的是一个普通的非唯一索引。允许索引的值不不同,因此索引五月包含索引的所有列中值相同的行。这些索引不会对您的数据施加任何限制,因此它们仅用于访问—用于快速到达特定范围的记录而不扫描所有记录。
独特的指的是索引的所有行都必须是唯一的。也就是说,对于该索引中的所有列,同一行可能与另一行具有不同的非null值。UNIQUE索引除了用于快速达到特定的记录范围外,还可以用于对数据实施约束,因为数据库系统不允许在插入或更新数据时违反不同值规则。
您的数据库系统可能允许将UNIQUE索引应用于允许NULL值的列,在这种情况下,如果两行都包含NULL值,则允许它们相同(这里的基本原理是NULL被认为不等于本身)。但是,根据您的应用程序,五月会发现这是不可取的:如果您希望防止这种情况,应该在相关列中禁止使用NULL值。
主要的的行为完全像一个UNIQUE索引,除了它总是被命名为'PRIMARY',并且在一个表中可能只有一个(并且应该总是有一个;尽管一些数据库系统并不强制执行这一点)。PRIMARY索引旨在作为唯一标识表中任何行的主要手段,因此与UNIQUE不同的是,它不应该用于任何允许NULL值的列。PRIMARY索引应该位于足以唯一标识一行的最小列数上。通常,这只是一个包含唯一的自动递增数字的列,但如果有其他任何东西可以唯一地标识一行,例如“;countrycode"在国家列表中,您可以使用它。
一些数据库系统(如MySQL的InnoDB)将表的记录按照它们在PRIMARY索引中出现的顺序存储在磁盘上。
全文索引与上述所有索引都不同,它们的行为在不同的数据库系统之间有显著差异。FULLTEXT索引只对使用MATCH() / AGAINST()子句完成的全文搜索有用,不像上面三个——它们通常在内部使用b-树(允许从最左边的列开始选择、排序或范围)或哈希表(允许从最左边的列开始选择)实现。
其他索引类型都是通用的,而FULLTEXT索引则是专门的,因为它只服务于一个狭窄的目的:它只用于“全文搜索”。特性。
我觉得这已经被很好地覆盖了,除了以下几点:
KEY
INDEX
SECONDARY INDEX
UNIQUE
FULLTEXT
SEARCH INDEX
CHAR
VARCHAR
TEXT
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