MySQL中INDEX、PRIMARY、UNIQUE和FULLTEXT的区别是什么?
MySQL中INDEX、PRIMARY、UNIQUE和FULLTEXT的区别是什么?
在创建MySQL表时,PRIMARY、UNIQUE、INDEX和FULLTEXT之间有什么区别?
我该如何使用它们?
区别
-
KEY或INDEX指的是普通的非唯一索引。允许索引中存在非唯一的值,因此索引可以包含所有索引列中具有相同值的行。这些索引不对数据强制执行任何约束,因此它们仅用于访问-用于快速到达某些记录范围而不扫描所有记录。
-
UNIQUE指的是索引,其中索引的所有行必须是唯一的。也就是说,与该索引的另一行相比,同一行可能不具有相同的所有列中的非NULL值。除了用于快速到达特定的记录范围之外,唯一索引还可以用于强制执行数据约束,因为数据库系统在插入或更新数据时不允许违反唯一值规则。
您的数据库系统可能允许将唯一索引应用于允许NULL值的列,此时,如果两行都包含NULL值,则允许它们相同(在这种情况下,NULL被认为与自己不相等)。但是,根据您的应用程序,您可能会发现这不可取:如果您希望防止这种情况发生,则应禁止相关列中的NULL值。
-
PRIMARY与唯一索引完全相同,只是它始终被命名为“PRIMARY”,并且在表格上只能有一个(应该始终有一个;尽管某些数据库系统不强制执行此规则)。主键应该作为唯一识别表中任何行的主要手段,因此,与唯一索引不同,主键不应用于允许NULL值的任何列。您的主键应该是足以唯一识别一行的最少列数。通常,这仅是包含唯一自动增量号码的一个列,但如果有其他可以唯一识别行的任何内容,例如“国家代码”在国家列表中,您也可以使用它。
-
FULLTEXT索引与上述所有索引不同,它们在数据库系统之间的行为有很大的差异。 FULLTEXT索引仅对使用MATCH() / AGAINST()子句进行全文搜索有用,而上述三个典型地使用b-tree(允许从左侧开始选择、排序或范围)或哈希表(允许从左侧开始选择)内部实现。
其他索引类型是通用的,FULLTEXT索引是专门的,因为它只用于“全文搜索”功能。
一些数据库系统(例如MySQL的InnoDB)将表的实际记录存储在PRIMARY KEY的B-tree索引内部。
相似之处
-
所有这些索引都可以有多个列。
-
除FULLTEXT外,列顺序很重要:对于索引在查询中有用,查询必须使用从左侧开始的索引列 - 除非它还使用前面的列在索引中匹配静态值。 (对于FULLTEXT索引对查询有用,查询必须使用索引的所有列。)