mysql中key和index的区别

关于mysql数据库索引
key 是数据库的物理结构,处于模型层面的,它包含两层意义和作用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等。

index是数据库的物理结构,处于实现层面的,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。
索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。
Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引。

这个怎么理解啊?key和index的区别,能不能解释的实在一些,看了一些资料,还是不太明白。

阅读 12.1k
4 个回答

嗯这确实是比较容易混淆的地方。
在我们使用MySQL中可能压根不会注意这个问题,因为大多数情况下他们展示出来的效果都差不多,但是还是不能将他们划等号(至少理论上是这样)
索引(index)和约束(key)的区别主要在于二者的出发点不同,索引(index)负责维护表的查找和操作速度,约束(key)负责维护表的完整性
而有这个困惑的话,很可能是由于MySQL中有一个奇怪现象:

  • MySQL中的索引是约束性索引(即创建索引自动也会创建约束)

  • 并且MySQL中创建约束也会自动附带索引。

很奇怪吧,两者不同的东西但是创建的时候又会附带给对方,为什么这样做呢?因为原因是:

MySQL中的约束效果是通过索引来实现的,MySQL数据库判断是否当前列是否unique就是通过unique索引判断的。

最后我帮你总结下:

  • 约束有主键约束,唯一约束,外键约束,非空约束,检查约束(在MySQL中压根无法使用检查约束,但可以正常建立),等

  • 索引有普通索引,主键索引,唯一索引,联合索引,全文索引,等。

  • 两者的实现都可以通过建表时实现,建表后的话通过alter语句来实现建立与删除,具体语句直接百度
    以上二点我经过测试在MySQL5.5 ,innoDB存储引擎下。

理论上是不能将MySQL的key和index划等号的,他们不是一回事,但在实际使用中,他们基本没有区别

index, 索引,就像你有一本书,书的目录就是索引,主要功能是让你快速找到你要的内容
primary key,主键,他即有唯一性约束,同时又包含索引
unique key, 唯一键,表示当前字段不能包含重复值
foreign key, 外键,表示当前字段的值是必是引用的主键的值

不知道这样说好理解吗

我认为键本身就是个不存在的东西,只不过我们把它叫做“键”而已。比如化学键,这个“键”真的存在吗?比如水分子由两个氢离子+一个氧离子组成,那为什么这三个离子之间相互约束,不分开呢?因为有化学键让它们结合在一起!

可是化学键的本质,只不过是离子之间电荷的作用力而已(带正电的氢离子和带负电的氧离子相互吸引),只不过我们把这个东西称为“化学键”。

同理,mysql中的“键”其实也是一个抽象的东西,它就是一个起约束作用的东西,什么叫约束?就是规定你不能做什么,比如规定一个字段不能为空(NOT NULL),规定你不能有重复值(UNIQUE KEY)、规定你的值必须来自于另一个表(FOREIGN KEY)。

而mysql中实现这些“键”的功能的是“索引”,所以,索引就相当于化学键中的“电荷相互作用力”,比方说我要给某个字段添加一个唯一键,那么它本质上其实是添加一个唯一索引,因为实现“唯一键”这个“唯一”功能的,就是唯一索引。

13.1.20 CREATE TABLE Statement中可以搜索到以下说明

KEY | INDEX

KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemented for compatibility with other database systems.

翻译:KEY通常是INDEX的同义词。当在列定义中给出键属性PRIMARY KEY时,也可以仅将其指定为KEY。这是为了与其他数据库系统兼容而实现的。

mysql官方文档也说了,key关键字是index的同义词。不过mysql确实也让人很迷惑,比如外键,你删除foreign key后还必须单独删除它的索引(虽然这个索引留着不会影响什么,但是如果这索引文件大的话,也会占硬盘空间,留着也没用,所以要删掉)。

弄清楚这些名词没啥意义,还不如多看看怎么建索引以及索引的限制

推荐问题
宣传栏