MySQL学习笔记(六)—MySQL普通索引和唯一索引的区别

一、change buffer介绍

A special data structure that records changes to pages in secondary indexes. These values could result from SQL INSERT, UPDATE, or DELETE statements (DML). The set of features involving the change buffer is known collectively as change buffering, consisting of insert buffering, delete buffering, and purge buffering.
一种特殊的数据结构,用于在辅助索引中记录对页的更改。这些值可能来自SQL INSERT、UPDATE或DELETE语句(DML)。涉及更改缓冲区的一组特性统称为更改缓冲,包括插入缓冲、删除缓冲和清除缓冲

注意关键词针对的是辅助索引

当需要更新一个数据页时,如果数据页在内存中就直接更新

如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性

change buffer 在内存中有拷贝,也会被写入到磁盘上

二、merage

将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge

merage的时机:

  1. 访问change buffer的数据页
  2. 后台线程定期merage
  3. 数据库正常关闭过程中merage
change buffer的好处
  1. 更新操作先记录在 change buffer,减少读磁盘,提升写入性能
  2. 将数据从磁盘读入内存涉及随机 IO 的访问,是非常耗时的操作,change buffer减少了随机磁盘访问,所以提升了上述写入性能
  3. 数据读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率

三、索引与change buffer

唯一索引
每次修改或者插入数据,都需要判断该数据的唯一性,必须将对应的数据页读入内存进行判断,然后直接更新内存,将数据写入磁盘,不使用change buffer

普通索引
可以使用change buffer的特性,每次写入数据,直接将更新记录写入change buffer即可

在生产环境不可以随便将普通索引改成唯一索引,可能会因为不能使用change buffer导致数据库性能不足。

在建立索引的时候:

  • 如果写多读少,在满足业务的前提下,最好使用普通索引,不可随便乱建唯一索引
  • 如果写完数据马上会做查询,建议可以根据具体业务情况,选择唯一索引,或者将change buffer关闭,因为写入change buffer后立即查询,会产生merage,不仅随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价
  • change buffer 这个机制的收效是非常显著,在建辅助索引的时候我们需要慎重选择是否建立唯一索引

四、changeBuffer参数配置

参数innodb_change_buffering来控制是否启用change buffer

--all:      默认值。开启buffer inserts、delete-marking operations、purges
--none: 不开启change buffer
--inserts:  只是开启buffer insert操作
--deletes:  只是开delete-marking操作
--changes:  开启buffer insert操作和delete-marking操作
--purges:   对只是在后台执行的物理删除操作开启buffer功能

参数innodb_change_buffer_max_size设置了change buffer可以占用buffer pool的百分比

innodb_change_buffer_max_size  25,默认值

这两个参数生产上一般使用默认值

五、change buffer 和 redo log

数据写入流程:
两行数据: row1(内存中有) row2(内存中无)

  1. row1的page1在内存中有,直接更新
  2. row2的page2在内存中无,先写入change buffer,记录“我要向page2中插入一行”这个信息
  3. 将上述两个动作写入redo log

这时有读请求进来:

  1. page1内存中有,直接返回,不需要先持久化到磁盘,这种页缓存技术在各种中间件中大量使用
  2. page2需要从磁盘读取到内存,将 change buffer 中的操作应用到page2,生产新版本数据,再返回
对比change buffer和redo log:
  • redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写)
  • change buffer 主要节省的则是随机读磁盘的 IO 消耗,进而提高数据的写入性能

你可能感兴趣的:(MySQL,唯一索引,MySQL)