摘要:
现在我已经知道了,MySQL 的每行数据都存储在数据页上,那为什么需要数据页呢?实际上是为了提高数据的读取效率,把读取的指定数据所在数据页中的其他数据行都一次性写入缓存,避免频繁的磁盘 IO 读取数据。那么每行数据又是如何存储的?又如何知道数据在哪个数据页?在哪个数据区?在哪个表空间呢? 行格式 实 阅读全文
摘要:
MySQL 高并发场景下会使用多线程来处理请求,然后访问存储在 Buffer Pool 中的共享缓存页,多个线程访问同一个 Buffer Pool 资源必然是要加锁来进行的。虽然对数据的查询、更新等操作都是在内存中进行的,即使加锁性能也是可以的。但如果大量请求需要通过磁盘加载数据到缓存,就需要进行磁 阅读全文
摘要:
缓存淘汰 现在我知道数据页要加载到缓存,需要通过 free 链表找到一个空闲的缓存页,然后把数据写入缓存页。但是缓存页的数量是有限的,当缓存页用尽了该咋办呢?应该通过一定的机制把一些缓存页刷回磁盘,空闲一些缓存页出来。那么哪些缓存页需要被刷入磁盘呢?当然是那些不经常使用的缓存页给刷入磁盘啦,这时就需 阅读全文
摘要:
脏数据页 基于 free 链表找到一块空闲的缓存页写入数据后,然后更新了这个缓存页,此时缓存页中的数据就与磁盘中的数据页不一致了,那么这个缓存页就是脏数据或者说脏页。最终在内存里更新的这些脏页是会被刷入磁盘的,但是不可能所有的缓存页都刷入磁盘,因为有些缓存页根本没有更新过。所以需要一个数据结构来保存 阅读全文
摘要:
Buffer pool 是 InnerDB 存储引擎的一个重要组件,MySQL 的所有 CRUD 操作都是围绕 Buffer pool 进行的。现在只知道 Buffer pool 是一个缓冲池,里面存放了磁盘数据的缓存,那么 Buffer pool 是一个什么样的结构,是如何在 SQL 执行过程中起 阅读全文