当定义表结构时,通常不会关心表字段顺序,因为select后面列顺序并不影响结果。但列顺序会影响表实际存储大小,也就说即使数据完全一样,但列顺序不同存储空间不同。
因为CPU对齐的缘故(cpu按照块方式访问),从而影响数据结构的内部大小。可能你不会相信,下面我们测试。
字段顺序布局
test=# CREATE TABLE t_test (
i1 int,
i2 int,
i3 int,
v1 varchar(100),
v2 varchar(100),
v3 varchar(100)
);
-- CREATE TABLE
我们创建了有6列的表,其中三个为int放在一起,另外三个varchar放在一起,下面插入1千万示例数据:
test=# INSERT INTO t_test SELECT 10, 20, 30, 'abcd', 'abcd', 'abcd'
FROM generate_series(1, 10000000);
-- INSERT 0 10000000
现在检查表数据大小:
test=# SELECT pg_size_pretty(pg_relation_size('t_test'));
pg_size_pretty
----------------
574 MB
(1 row)
字段无序布局
下面改变列布局,varchar和int顺序打乱:
test=# CREATE TABLE t_test (
v1 varchar(100),
i1 int,
v2 varchar(100),
i2 int,
v3 varchar(100),
i3 int
);
-- CREATE TABLE
然后插入同样的数据:
test=# INSERT INTO t_test SELECT 'abcd', 10, 'abcd', 20, 'abcd', 30
FROM generate_series(1, 10000000);
INSERT 0 10000000
… the table will be a lot larger:
test=# SELECT pg_size_pretty(pg_relation_size('t_test'));
pg_size_pretty
----------------
651 MB
(1 row)
我们看到数据完全一样(为了对比两者的差异)。如果我们使用“abc” 代替 “abcd”占用空间大小一样,因为4个字符是最小数据占用空间。
总结
通过上面示例,我们得出重要结论。尽可能让相似数据类型在一起,尤其是让int类型放在表的开始位置,会在空间和性能上有所提升。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/120005804