从索引上可以看看到底这几年PG 12 -- PG13 --PG 14 他们都做了些什么改进,为什么PG 是最高级的开源数据库。
First,INDEX 对于数据库来说是一个核心的功能,从上世纪这个功能就存在并且一直是众多数据库快速查询的生命线。
对于POSTGRESQL 本身来说索引的添加与维护与其他的数据库比较并不是一件简单的事情,MVCC 在每个表中产生多个版本,让索引的维护也变得不哪里简单。索引本身也会有bloat 的问题,占用更多的空间的问题等等,数据修改后,尤其大批量修改后索引的消耗问题应该被重视。
之前的索引在page页面的存储本身并不是有序存储的,这会造成两个问题
1 index 会在数据的插入中,由于数据存放的不顺序,导致数据从中间的页面进行分割,然后浪费页面存储的空间
2 页面不连续查询索引的效率低下
PG12 中将数据的物理地址ctid 和和索引存储在一起,成为索引的一部分,这样的好处
1 索引物理数据存储变得有序
2 索引的物理页面的分割不在从中间分割,而是最右端分割
好处也是显而易见,进行主键index scan 速度会更快,同时节省了INDEX存储空间
PG11.7 测试结果 索引大小544MB
PG12.2
PG12 索引大小408MB, 544 -408 = 136MB 同样的功能和表,索引的大小减小了136MB.
查询速度,对比看同样查询索引命中的数据 PG11 比PG12 慢了 60%
打开两个表的索引内部的数据,可以查看PG12 中的 CTID 中物理数据存储是有序的,PG11 中的CTID 中的数据存储是无序的。
同时使用RDS 云的同学,虽然从11 升级到12很方便,但升级后的索引的顺序方面不会有改变,需要对PG11 升 12 的索引进行reindex.
参考文章:德哥关于pg12 索引改善的文字
https://www.alibabacloud.com/blog/postgresql-12-b-tree-index-improvements-duplicate-key-and-sort-by-ctid_597615