Skip to the content.

VACUUM [undone]

1. VACUUM

在一般的PostgreSQL 操作里,那些已经 DELETE 的行或者被 UPDATE 过后过时的行并没有从它们所属的表中物理删除; 在完成VACUUM之前它们仍然存在。因此有必要周期地运行VACUUM, 特别是在经常更新的表上。

vacuum和相关的autovacuum进程是控制PostgreSQL由于mvcc机制导致膨胀的方法

VACUUM [FULL] [FREEZE] [VERBOSE] [table]

VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE
            [table [(column [, ...] )]]

参数

示例

清理当前数据库下的所有表:

VACUUM;

只清理一张特定的表:

VACUUM mytable;

清理当前数据库下的所有表同时为查询优化器收集统计信息:

VACUUM ANALYZE;

2. MVCC是什么?

MVCC(Multiversion concurrency control)是指多版本并发控制,通俗的讲就是MVCC通过对数据进行多版本保存,根据比较版本号来控制数据是否展示,从而达到读取数据时无需加锁就可以实现事务的隔离性。

MVCC常用实现方法

一般MVCC有2种实现方法:

PostgreSQL的MVCC实现方式优缺点

PostgreSQL中MVCC的具体实现

总结

为了保证事务的原子性和隔离性,实现不同的隔离级别,PostgreSQL引入了MVCC多版本机制,概括起就是:

如上文所讲,PostgreSQL的MVCC实现方法有利有弊。其中最直接的问题就是表膨胀,为了解决这个问题引入了AutoVacuum自动清理辅助进程,将MVCC带来的垃圾数据定期清理。

参考链接:

  1. InnoDBMySQL的数据库引擎之一,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。