09 | 普通索引和唯一索引,应该怎么选择?

从性能的角度考虑,你选择唯一索引还是普通索引呢?

查询分析:

由于是用的B+树,从树根找到叶子节点,也就是数据页,数据页内使用二分法来定位记录

普通索引:找到满足条件的记录,继续向下查,知道碰到不满足条件的记录

唯一索引:找到一个满足条件的记录,停止检索

由于InnoDB的数据是按数据页来读写的,也就是说读取时是将一页数据读取进内存,数据页默认大小是16kb,所以在数据唯一的情况下,普通索引也就多做了一次判断,只需要一次寻址和计算。除非是在不同数据页中,操作会复杂些,但是对于整型字段,一个数据页可以放近千个key,因此出现的概率很低。

索引普通索引和唯一索引查询性能区别不大

更新分析:

change buffer:  当数据页需要更新,如果数据页在内存中就直接更新,如果数据页不在内存中,InnoDB会把这些更新操作缓存在change buffer中,这样就不需要从磁盘中读数据页,下次查询需要访问这个数据页,将数据页读入内存,然后执行change buffer 与这个页有关的操作,保证数据逻辑正确性。

 将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 purge(清洗)。除了访问这个数据页会触发purge,系统后台会定期purge。数据库正常关闭也会执行purge。

显然,如果能将更新放在change buffer ,能大大提高更新速度,并且不会读数据页到内存要占用buffer pool,这种方式还能避免占用内存,提高内存利用率。

什么条件下使用change buffer?

唯一索引需要唯一性检验,更新时,必须先读数据页到内存,因此必须读数据页,也就没必要使用到change buffer,因此change buffer 只有唯一索引可以用

change buffer 占用buffer pool内存,因此不可以无线增大,通过参数 innodb_change_buffer_max_size 来动态设置。这个参数设置为 50 的时候,表示 change buffer 的大小最多只能占用 buffer pool 的 50%。

例子:插入一条数据,普通和唯一所索引的区别

这个记录要更新的目标页在内存中

普通索引:判断数据的唯一性,插入

唯一索引:直接找到位置插入

这个记录要更新的目标页不在内存中

普通索引:写入到change buffer 中

唯一索引:读数据页,判断唯一性,是否插入

将数据从磁盘读入内存涉及随机 IO 的访问,是数据库里面成本最高的操作之一。change buffer 因
为减少了随机磁盘访问,所以对更新性能的提升是会很明显的
change buffer 的使用场景:写多读少
因为change buffer的主要目的就是减少读取数据页,也就是说在数据页purge之前,写的次数越多,收益也就越大,比如账单类,日志类等系统。
反之,如果查询比较频繁,写入后立即查询,也就是数据页purge,那么随机访问的次数不会减少,还要维护change buffer ,反而不好
索引选择和实践:
普通和唯一查询上没什么区别,更新上普通索引配合change buffer效果更好,尤其是数据量大的表,使用普通索引,开大change buffer 可以提高写入速度
change buffer redo log
redo log 主要节省的是随 机写磁盘的 IO 消耗(转成顺序写),
change buffer 主要节省的则是随机读磁盘的 IO 消
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值