这一章节的重点在 buffer pool manager
buffer pool manager
这一章学完我感觉我才理解了,其实我在数据库里拿到所有的数据似乎都过了一次内存。而内存有自己的算法和策略可以尽量帮我缓存我会多次访问的数据。
访问数据的流程大概类似于 execution engine 执行了一条 query, 告诉 buffer pool 要获取的数据页,buffer pool 将调用系统函数帮助 execution engine 去查询 disk 的数据,访问 disk 上的数据字典找到对应的 page position and offset。取出该数据然后加载到 buffer pool 中。
最后我们将指向 buffer pool 的地址指针返回给 execution engine。即可让 application layer 操作该数据了。
从底层来看 buffer pool 就是 DBMS 划定的一块内存空间。在我进场使用的 MySQL 中,他几乎可以分配到数据库内存的80%以上以加快数据获取。
buffer pool 可以是一个固定元素大小的 array。比如 MySQL 里面规定 page size 16kb,那么 buffer pool 中的页大小就是 16kb。array 中的元素我们称之为 frame。frame 里面可以存储的是从硬盘 page 页中拷贝出来的数据。
ok 那么有一个套娃的问题来了,我怎么知道 page1 page2 page3 4 5 6 7 在 buffer pool 里面的哪个位置呢?因为 frame 只是存储了 page 而已。PageTable 用于解决这个问题, PageTable 可以 route pageID to buffer pool and return the point.
同时 PageTable 可能还存储了一些别的有用的 metadata 针对每个 page。比如当前是否已经是脏页或者被引用次数或者是否需要将该 page 固定之类的,引用次数也许后续可以被用来测算是否需要将该数据 evict from buffer pool. Pin 可以帮助我们让 dbms 知道不要将这个 page evict out from buffer pool。这里还有一个叫做 latch 的能力不知道中文应该叫什么。
latch 和 pin 还不太一样。latch 是避免多线程或者线程程序使用已经预定的 buffer pool 的这个位置。因为我已经即将要去获取 bufferpool 的某个页地址了。我要预防其他人也同时去使用这个地址。
而 pin 却是预防我在使用过程中被人换走了这个 page。如果我在使用,我希望他一直呆在 bufferpool 中直到我使用完毕。
这里我们谈到的 latch 有点锁的感觉,但是却不是 locks。所以课程又强调了一次 Locks 和 latches 的区别
简单总结一点就是,Latch 在 dbms 的世界中更像是一把保护各种静态条件的锁,比较底层。 Locks 要做的世界是锁住逻辑,保护事务正常进行,如果失败还需要回滚操作。
PageTable 和 PageDictionary 的关系就更简单一点不赘述了看 slices 记住就行。
Buffer Pool Optimizations
MULTIPLE BUFFER POOLS
使用多个 buffer pool 实例有两种方案可以实现。将数据分配进不同的 buffer pool 可以显著降低锁竞争的问题。大家互相读取锁定对应数据,和占用空间,互不干扰。
也可以更少的出现竞态条件。
PRE-FETCHING
预读一些记录到 buffer pool 中。比如我读了 page 1 2 3 那大概率我在执行一个 scan 操作,我们应该将 4 5 6 也提前读进来加快结果返回的速度。
SCAN-SHARING
如果一个查询已经扫描了整张表,然而其他查询也想做类似的事情。DBMS 将会将第二个查询的 cusor attach 到 第一个查询的 cursor 上。这里主要是解决一个数据获取效率的问题,因为和 cursor1 一起读,会直接享受到 buffer pool 里面的数据,直接从内存里面获取这些数据。等跟着 cursor2 读完了自己再回去补上没有读到的部分就可以了。这样我们可以充分重复利用 cursor1 读进 buffer pool 的数据。
BUFFER POOL BYPASS
有一些特殊的执行可以选择绕开 buffer pool 以避免影响其缓存策略。
OS PAGE CACHE
类似像 postgrelSQL 这样的数据库可以有效的利用系统页缓存。
BUFFER REPLACEMENT POLICIES
下面就是核心了,谈了这么多,那么该使用什么策略去决定缓存什么数据,缓存多久。又什么时候逐出数据呢?取决于我们使用什么 replacement 的算法。
Reference:
https://www.youtube.com/watch?v=Y9H2HaRKOIw
https://15445.courses.cs.cmu.edu/fall2022/slides/06-bufferpool.pdf
https://zhuanlan.zhihu.com/p/65811829
标签:Management,15,Buffer,可以,buffer,缓存,数据,page,pool From: https://www.cnblogs.com/piperck/p/16882556.html