我有一个非常适度的服务器,但有很多数据(+ 50GB)。
我从产品中收集每日价格并存储它们。由于我使用外部系统,产品和商店的ID是varchars。
现在的表格如下:
products (about 10k rows)
------------
id varchar
other data..
shops (about 3k rows)
------------
id varchar
other data..
prices (more than 100 million rows!!)
-------------------------------
id_price serial (autoincrement)
id_product varchar
id_shop varchar
date
要处理的硬表是prices
,它消耗了大约50%的数据库,另外40%用于索引(几乎占整个数据库的90%!)
varchar id通常大约10个字符,以utf8编码,尽管它们都是ascii字符。
我的问题是是否值得将varchar ID更改为数字ID以允许 1)减少表的大小和 2)查询的加速(特别是扫描和连接,可能是因为从磁盘读取的页面较少?)
我正在考虑向products
和shops
表添加自动增量密钥,然后更改prices
表以指向新值。请注意,这个过程对我的服务器来说非常大,这就是为什么我自己无法测试它。
答案 0 :(得分:0)
需要将10位数字存储为big integer
。根据最大和中等varchar
尺寸的大小,存储减少量可能很大:
select
pg_column_size('9223372036854775807'::varchar(18)) as varchar18,
pg_column_size(''::varchar(18)) as empty_varchar18,
pg_column_size('9223372036'::varchar(12)) as varchar12,
pg_column_size(9223372036854775807) as bigint
;
varchar18 | empty_varchar18 | varchar12 | bigint
-----------+-----------------+-----------+--------
22 | 4 | 14 | 8
较小的表和索引会对性能产生积极影响。