大型PostgreSQL表:更好的添加列或创建新表来存储元数据?

时间:2012-02-22 18:04:10

标签: sql json postgresql database-design

我有一个大表(约200万行),每行代表一个图像。我想为每个图像存储JSON格式的EXIF元数据。这个JSON blob大约是每个图像6KB。

这个EXIF元数据不会经常被查询/使用,我想知道将它存储在一个包含两列(imageid,exifjson)的单独表中是否明显更高效,或者PostgreSQL是否会处理它这对于现有表格上的text列很好。我不希望添加列来显着减慢表上的普通查询,或者数百万的6KB文本值使PostgreSQL陷入困境。

2 个答案:

答案 0 :(得分:5)

我会将该列TOAST - 编辑。

 ALTER TABLE ... ALTER <column> SET STORAGE <EXTERNAL|EXTENDED>;
 -- EXTERNAL - out-of-line storage, not compression[1]
 -- EXTENDED - both compression and out-of-line storage

PostgreSQL已经尝试将它用于大于~2kB的数据。

[1]“所使用的压缩技术是LZ系列压缩技术中相当简单且非常快速的成员。”

答案 1 :(得分:2)

最好使用单独的表,但您可以使用现有表。除非使用现有的“select * from”查询检索此字段,否则几乎不会产生影响。而且你永远不会用这些数据填充postgres,因为它有几乎无限的阈值:

  • 最大数据库大小无限制
  • 最大桌面大小32 TB
  • 最大行大小1.6 TB
  • 最大字段大小1 GB
  • 每张桌子的最大行数
  • 每个表250 - 1600的最大列数取决于列类型
  • 每张表无限制的最高指数

http://www.postgresql.org/about/

关于选择其他列数据时的干扰:

  

非常长的值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。

http://www.postgresql.org/docs/current/static/datatype-character.html