MySQL 普通索引和唯一索引的区别

MySQL 普通索引和唯一索引的区别

索引不管是工作还是找工作都是必须要掌握的一个知识,下面来学习一下普通索引和唯一索引的区别。

当然在使用上就能体验出来,唯一索引也是索引功能和普通索引一样,只是在插入的时候会校验数据的唯一性。
这两类索引在查询能力上是没差别的,主要是对更新性能的影响。建议尽量选择普通索引。

查询操作

普通索引
查找到第一个满足条件的记录后,继续向后遍历,直到第一个不满足条件的记录。
唯一索引
由于索引定义了唯一性,查找到第一个满足条件的记录后,直接停止继续检索。

普通索引会多检索一次,几乎没有影响。因为 InnoDB 的数据是按照数据页为单位进行读写的,需要读取数据时,并不是直接从磁盘读取记录,而是先把数据页读到内存,再去数据页中检索。

一个数据页默认 16 KB,对于整型字段,一个数据页可以放近千个 key,除非要读取的数据在数据页的最后一条记录,就需要再读一个数据页,这种情况很少,对CPU的消耗基本可以忽略了。

因此说,在查询数据方面,普通索引和唯一索引没差别

更新操作

更新操作并不是直接对磁盘中的数据进行更新,是先把数据页从磁盘读入内存,再更新数据页

普通索引
将数据页从磁盘读入内存,更新数据页。
唯一索引
将数据页从磁盘读入内存,判断是否唯一,再更新数据页。

由于 MySQL 中有个change buffer的机制,会导致普通索引和唯一索引在更新上有区别

change buffer的作用是为了降低IO 操作,避免系统负载过高。change buffer将数据写入数据页的过程,叫做merge

如果需要更新的数据页在内存中时,会直接更新数据页;如果数据不在内存中,会先将更新操作记入change buffer,当下一次读取数据页时,顺带merge到数据页中,change buffer也有定期merge策略。数据库正常关闭的过程中,也会触发merge

对于唯一索引,更新前需要判断数据是否唯一(不能和表中数据重复),如果数据页在内存中,就可以直接判断并且更新,如果不在内存中,就需要去磁盘中读出来,判断一下是否唯一,是的话就更新。所以change buffer用不到。

结论:唯一索引用不了change buffer,只有普通索引可以用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值