繁体   English   中英

如何减少PostgreSQL数据库大小?

[英]How to reduce PostgreSQL database size?

我打算从MySQL迁移到PostgreSQL,因为我想使用TimescaleDB。

直到我检查了PostgreSQL(v11.2)和MySQL(v5.6)所使用的存储大小之前,一切都看起来不错。 对于完全相同的行数(1,440,000)和内容:

  • 的MySQL:156 MB的
  • PostgreSQL:246 MB
  • PostgreSQL + TimescaleDB(分区/分块数据):324 MB

MySQL和PostgreSQL的编号类似(即包括索引和其他约束),PostgreSQL + TimescaleDB具有在表中添加时间戳的开销。 有关表如下所示:

create table cell(
    cell_id            serial not null
   ,ts                 timestamp not null
   ,parent_id          int references parent( parent_id )
   ,instance_id        smallint
   ,v                  float
   ,a                  float
   ,t                  float
   ,s1                 float
   ,s2                 float
   ,s3                 float
   ,s4                 float
   ,s5                 float
   ,primary key( cell_id )
);
create index ix_cell_pid on cell( parent_id );
create index ix_cell_inst on cell( instance_id );

为什么PostgreSQL比MySQL占用更多的存储空间?
是否有某种方法可以将其大大降低到接近MySQL的水平?

在您的情况下,添加timestamp列不应超过11 MB(1440000 * 8字节,未添加填充)。

为了进行公平的比较,您是否在测量尺寸之前在Postgres中运行VACUUM FULL 我怀疑表和索引膨胀。

有关:

在MySQL中,数据类型float是占用4个字节的单精度浮点类型。

在Postgres中,同一float是双精度浮点类型,占用8个字节 (别名: float8double precision )。

那应该解释另外44 MB的差异。 要将苹果与苹果进行比较,请创建具有4字节real列(别名float4 )的Postgres表。 注意与MySQL的区别,其中real用于8字节浮点数! 不幸的分歧。

MySQL手册: https//dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Postgres手册: https : //www.postgresql.org/docs/current/datatype-numeric.html

有关:

您显示两个索引 根据它们的用途,一个多列索引可能能够在Postgres中同时替换两者-在这种特殊情况下,其占用的磁盘空间与其所替换的两个磁盘之一一样多(在给定的规格下节省约50 MB)。

create index ix_cell_pid on cell( parent_id, instance_id );

考虑:

除了Erwin Brandstetter的答案之外:

通常还有一些隐藏的系统列要考虑(用于实现MVCC)以及其他元组信息,例如提示位(用于缓存行可见性)。

您可以使用pageinspect扩展名查看此信息,例如:

create extension pageinspect;
select * from heap_page_items(get_raw_page('cell', 0));

有关系统列的说明,请参见此处

您的索引也将包含空白空间,以允许更快地插入更多的元组。 CREATE INDEX docs中查找“ fillfactor”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM