【发布时间】:2018-03-15 14:30:43
【问题描述】:
这可能是一个愚蠢的基本问题,但正如标题中所述,我想知道 PostgreSQL 在拥有数百万个条目时如何处理性能(有可能达到十亿个条目)。
更具体地说,我想将数据(音频、照片和视频)存储在我的数据库中(我只是存储它们的路径,文件在文件系统中组织),但我必须决定是使用单个表“数据”来存储所有不同类型的数据,还是使用多个表(“data_audio”、“data_photos”、“data_videos”)来分隔这些类型。
我问这个问题的原因是我有 95% 的照片和 5% 的音频和视频,如果我想在我的数据库中查询音频条目,我不希望它是所有照片条目都减慢了速度(在一千个中搜索一行必须与在一百万个中搜索不同)。所以我想知道 PostgreSQL 是如何处理这个问题的,以及是否有某种方法可以进行最佳优化。
我读过这个非常有趣且似乎相关的主题: How does database indexing work?
这是我应该做的吗?
回顾一下我将在我的核心表中存储的核心信息:
第一个选项:
-
数据表(包含音频、照片和视频):
- id 类型 bigserial
- _timestamp 类型时间戳
- path_file 类型文本
-
用户表:
- id 类型序列号
- 名字类型 varchar(255)
- 姓类型 varchar(255)
- 生日类型日期
- email_address 类型 varchar(255)
-
数据用户关系表:
- id_data 类型 bigserial
- id_user 类型序列号
-
活动表:
- id 类型序列号
- 名称类型 varchar(255)
- 描述类型文本
-
数据活动关系表:
- id_data 类型 bigserial
- id_activity 类型系列
(SEARCH查询主要是通过USERS.id过滤数据后的DATA._timestamp和ACTIVITIES.name字段)
第二个选项(仅将之前的 DATA TABLE 与以下三个表切换并保留所有其他表):
- DATA_AUDIO 表
- DATA_PHOTOS 表
- DATA_VIDEOS 表
补充问题: 每个用户都有一个数据库是个好主意吗? (在故事情节中,能否查询数据库的数据取决于你是否有权限,如果你想从两个不同的用户那里获取数据,你必须请求两个用户的权限,以及权限的过程本身就是一个进程,这里不做处理,所以假设你查询数据库的时候,总是查询同一个用户)
我希望我已经清楚了,提前感谢任何帮助或建议!
西里尔
【问题讨论】:
-
数百万行确实不是什么壮举,如果正确优化数据库,数十亿行是完全可能的。只需通过生成一堆随机数据来进行测试。
-
请注意您的连接 ("bridge") 表
data_users和data_activities应该不包含(大)序列,但(大) ints : FK 引用基表的 id 列。 -
非常感谢@deceze 和 joop,我会按照你说的尝试/纠正!
标签: postgresql database-design database-performance query-performance postgresql-performance