PostgreSQL 在拥有数百万条目时如何处理性能

Posted

技术标签:

【中文标题】PostgreSQL 在拥有数百万条目时如何处理性能【英文标题】:How does PostgreSQL deal with performance when having millions of entries 【发布时间】: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_usersdata_activities 应该包含(大)序列,但(大) ints : FK 引用基表的 id 列。 非常感谢@deceze 和 joop,我会按照你说的尝试/纠正! 【参考方案1】:

答案:

PostgreSQL 很酷,有数百万行。

如果不同类型的数据都具有相同的属性并且从数据库的角度来看是相同的(与其他表具有相同的关系等),则将它们保存在一个表中.如果没有,请使用不同的表。

索引访问表的速度与表的大小无关。

如果不同用户的数据有联系,比如他们使用通用基表,或者您希望能够为不同用户连接表,最好将它们保存在一个数据库中的不同模式中。如果无论如何将它们分开很重要,请将它们保存在不同的数据库中。

如果您使用行级安全性或让您的应用程序处理它,也可以将不同用户的数据保存在一个表中。

此决定很大程度上取决于您的用例和架构。

警告:不要创建包含数千个数据库的集群和包含数千个模式的数据库。这会导致目录中的性能问题。

【讨论】:

非常感谢您的完整回答,这是一个巨大的帮助!我会考虑所有这些,并根据您的答案继续! 嗨,我还有另一个关于性能问题的问题。将所有用户的所有数据保存在同一个表中更易于管理,但我想知道如果我有 50 到 100 个用户尝试访问此表,它将对访问时间产生多大影响。我需要我的系统既快速又简单(我猜每个人都想要这个哈哈哈),但我想说的是,拥有快速访问时间以提供更好的服务对我来说更重要。 PostgreSQL 如何处理这个问题?我应该使用多个数据库或服务器(如果有的话)? PostgreSQL 在并发方面非常出色。 50 或 100 个并发读者可能不会减慢速度。 非常感谢,我现在会收集我的数据并将所有内容保存在同一台服务器上的同一个数据库中,将来会看到它是否需要更改或需要扩展,再次感谢!

以上是关于PostgreSQL 在拥有数百万条目时如何处理性能的主要内容,如果未能解决你的问题,请参考以下文章

如何开发一个拥有全球数百万用户的Android app?

数百万个 3D 点:如何找到最接近给定点的 10 个?

当您在 LAMP 服务器上拥有数百万用户时,存储和获取图像的最快和最有效的方法是啥?

Twitter API - 为拥有数百万关注者的帐户获取关注者列表的有效方法

开源项目存活有多难? 拥有数百万用户的 Babel 陷入财务困境

批量地理定位数百万个 IP