作者回复: 分析很赞,把02篇和这篇文章贯通了.
问题
1. 这时候要“先读后写”,读的时候数据会读入内存,更新的时候直接改内存,就不需要change buffer了
2. Gap锁取决于业务怎么用哈。我感觉主要是因为gap锁概念比较难说清,大家有点放大它的意思了哈哈
3. Hit rate
4. 我不够熟悉,不能乱回答误导你😄
作者回复: 第一段的理解不准确哈。
insert的时候,写主键是肯定不能用change buffer了,但是同时也会要写其它索引,而其它索引中的“非唯一索引”是可以用的这个机制的;
第二段,你搜出来的这个不太完整。是这样的,change buffer的前身是insert buffer,只能对insert 操作优化;后来升级了,增加了update/delete的支持,名字也改叫change buffer.
作者回复: 系统表空间就是用来放系统信息的,比如数据字典什么的,对应的磁盘文件是ibdata1,
数据表空间就是一个个的表数据文件,对应的磁盘文件就是 表名.ibd
作者回复: 1 3 好问题
1. 锁是一个单独的数据结构,如果数据页上有锁,change buffer 在判断“是否能用”的时候,就会认为否
2. 增加
3. 是这样的,这个问题你分成两步来考虑。
第一步,merge其实是从磁盘读数据页到内存,然后应用,这一步都是更新的内存,同时写redolog
现在内存变成脏页了,跟磁盘数据不一样。之后就走刷脏页的流程。刷脏页也不用写。
=====
是否使用唯一索引,这个要看业务有没有保证,和性能是否有问题。
有几位同学都提了,我加到文末说明一下。
作者回复: 非常好,尤其括号里那句和最后一句
作者回复: 优秀
作者回复: 👍🏿
作者回复: 赞👍🏿
不会丢失还有redolog的功劳哈
作者回复: 所以主键索引用不上,都是对于那些二级索引的才有效。
一个insert语句要操作所有索引的嘛,收益在二级索引
作者回复: 👍🏿
拆开了分析很好
作者回复: “总觉得将 change buffer落盘意义不大。毕竟redo log中也会记录,当数据库崩溃时可以通过redo log将change buffer内容回放出来。” 是的,所以change buffer其实也是用了WAL机制。
“内存不足需要回收change buffer这部分内存“,只需要让change buffer本身持久化可以,不需要执行merge操作。merge操作是在读数据页的时候做的
赞回顾的习惯哈👍
作者回复: 👍🏿
作者回复: 抱歉,这里说的都是merge哈,是因为我之前写错了,你在这里看到的讨论都当作merge
作者回复: 1. 就是数据页没在内存,才能用上change buffer
2. B+树有序的。能找到(你想,数据库一开始启动的时候,要找一个磁盘上的记录是怎么找到,一样的过程)
作者回复: 1. 数据更新到磁盘是这两个都不少,是内存直接写到磁盘的。
2. 插入数据的时候,主键索引用不上,但是普通索引可以
看得糊里糊涂的时候可以看看评论区哈
作者回复: 比如有一个表a
那么a.ibd 就是数据表空间;
“表a的表结构”这个信息存在ibdata1的系统表空间里