还记得那次社招面试,我被面试官一句话问懵了:“你知道怎么通过 my.cnf 配置 InnoDB 的插入缓冲、双写缓冲、自适应哈希索引和预读策略吗?”当场脑袋嗡的一下。这篇文章就是我后来爬坑的完整经历。
来自面试官的灵魂发问
那是个阳光明媚的下午,我坐在一家技术氛围浓厚的互联网公司会议室里。
面试官扫了一眼简历,看着我说:“你 MySQL 用得不错,那你知道怎么在 my.cnf 里配置 InnoDB 的几个核心性能参数吗?”
我微笑点头。
他继续说:“那就请你具体讲讲,插入缓冲、双写缓冲、自适应哈希索引、预读策略,这 4 个功能,怎么在配置文件里开启或关闭,各参数的作用分别是什么?”
我:“……”
说实话,当时脑海里满是 innodb_ 开头的参数,但谁跟谁对应、默认值多少、实际用在哪,我真的没把握。
于是,这道题就成了我社招面试路上的一根刺——直到后来,我咬牙查文档、翻源码、搞实验,才彻底搞懂。
今天我就用故事形式,把这段“打怪升级”经历讲给你听。
插入缓冲(Insert Buffer):原来我插入的是“假的”
我们先来说说 插入缓冲(Insert Buffer),这是我第一个研究的“怪”。
在 InnoDB 里,如果你对一个二级索引做大量插入,按理说每次都要去磁盘上修改对应的 B+ 树,性能就会很差。但实际情况是,InnoDB 选择了“先缓存,再批量写入”的策略。
插入缓冲的实现类似“伪装成一块内存区域,等到时机成熟,再一次性落盘”。
在配置文件 my.cnf 里,有一个参数控制这个行为:
innodb_change_buffering = all
这个参数就是“大名鼎鼎”的插入缓冲开关,它的取值有:
- none:禁用插入缓冲。
- inserts:只缓冲插入。
- deletes:只缓冲删除。
- changes