标签:语句 执行器 buffer 更新 简述 内存 磁盘 数据 change
更新语句(增删改)的执行,基本流程和查询一致,也要经过连接器、分析器、优化器、执行器等功能模块,区别就在于拿到符合条件的数据之后的操作。
-
执行器先通过存储引擎获取需要修改的数据。如果该数据所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
-
执行器修改数据后,再调用存储引擎接口写入这行新数据。
-
存储引擎将这行新数据更新到内存(
buffer pool
)中,同时将这个更改前的数据记录到undo log
(保留历史数据,记录事务版本号,形成版本链),以及将更改后的数据记录到redo log
里面(记录的是数据页的改动),此时redo log
处于prepare
状态。然后告知执行器执行完成了,随时可以提交事务。 -
执行器生成这个操作的
binlog
,并把binlog
写入磁盘。 -
执行器调用存储引擎的提交事务接口,存储引擎把刚刚写入的
redo log
改成提交(commit
)状态,更新完成。
这里面还有一个
change buffer
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在
change buffer
中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer
中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。
change buffer
的收益主要在减少普通二级索引页从磁盘加载到内存的过程。对于数据的修改,还是要从磁盘中读数据到内存的。
标签:语句,执行器,buffer,更新,简述,内存,磁盘,数据,change 来源: https://www.cnblogs.com/dong320/p/16598044.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。