理解PostgreSQL中的映射表
PG中的映射表这个概念有点抽象,让我们用一个更生活化的比喻来解释,把数据库想象成一个巨大的图书馆。
图书馆的比喻
-
书和书架(表和数据块)
- 整个图书馆就是你的 数据库。
- 一个书架 就是数据库中的一个 数据块(Page),上面整齐地摆放着很多书。
- 每一本书 就是一条 数据记录(元组)。
-
问题所在:多版本和“死书”
- PostgreSQL 允许多人同时借阅和归还图书(并发读写)。为了不打扰正在读书的人,当有人修改一本书(比如更新了一条记录),它不是直接涂改原书,而是抄写一份新版本放在书架上。原来的那本旧书就变成了“死书”,它没有被扔掉,但已经没人会去读它了。
- 日积月累,书架上就堆满了这种没人要的“死书”,占用了大量空间。
-
图书管理员(VACUUM)
- 这时候就需要 VACUUM(清理) 这个“图书管理员”来定期整理书架,把“死书”清理掉,腾出空间放新书。
- 但是,如果一个书架一个书架地检查有没有“死书”,工作量巨大,非常耗时。
-
可见性映射表(VM)—— 智能标签系统
- 可见性映射表(VM) 就是为每个书架(数据块) 准备的一个智能标签。
- 这个标签非常简单,只有两种状态:
- 绿灯(1):表示这个书架上所有的书都是“活”的(即对所有读者都可见的最新版本)。没有“死书”。
- 红灯/无灯(0):表示这个书架上可能有“死书”,需要检查。
VM 如何发挥巨大作用?
现在,让我们看看这个“智能标签”系统如何让图书馆运作得更高效:
-
场景一:管理员整理书架(VACUUM)
- 没有VM时:管理员必须逐个检查每一个书架上的每一本书,来判断是不是“死书”。这太慢了!
- 有VM时:管理员推着小车,只需要扫一眼书架上的标签。看到 “绿灯” 的书架,他直接跳过,因为他知道这里没有垃圾。他只需要在 “红灯” 的书架前停下来仔细检查。这极大地提高了整理效率。
-
场景二:读者查资料(Index-Only Scan)
- 假设图书馆有一个非常详细的索引卡系统(数据库索引),索引卡上已经记录了某本书的关键信息和它在哪个书架。
- 没有VM时:读者根据索引卡找到书架位置后,还是必须走到那个书架前,把书拿下来翻一翻,确认这是不是他想要的最新版本。
- 有VM时:读者根据索引卡找到书架位置,同时他看了一眼书架的标签,发现是 “绿灯” 。这意味着他可以完全相信索引卡上的信息就是最新的,根本不需要走过去拿书,直接在索引区就得到了答案。这节省了大量的跑腿时间。
总结
所以,可见性映射表(VM) 的本质是一个元数据(关于数据的数据)的缓存。
- 它是什么? 一个为每个数据块标记“是否全可见”的位图。
- 它为什么快? 因为它用极小的空间(一个位),存储了关于整个数据块(通常是8KB)的状态信息。
- 它有什么用?
- 加速VACUUM:跳过无需清理的块。
- 实现索引快速扫描:在特定条件下,让查询无需访问表数据,只读索引就能完成。
它不是必须的,没有它数据库也能工作,但有了它,数据库的维护效率和查询性能都能得到质的提升。希望这个比喻能帮助你彻底理解它
