从性能的角度考虑,你选择唯一索引还是普通索引呢?
查询分析:
由于是用的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 中
唯一索引:读数据页,判断唯一性,是否插入