首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL 11:如何划分1000个租户

PostgreSQL 11:如何划分1000个租户
EN

Database Administration用户
提问于 2019-04-18 02:20:53
回答 1查看 2.2K关注 0票数 3

设置

我们有一个多租户应用程序,大约有1000个客户。当客户流失时,我们会在一段时间后删除他们的所有数据。我们有几个表非常大,我们正在考虑使用分区来分割每个客户。

问题

1000个租户(客户)是很多分区-在PostgreSQL上这样做合理吗?

More详细信息

目前,我们的租户之间的分隔是通过DB中所有表上的account_id列进行的。有几张桌子很大。例如,有一个event表(我对分区感兴趣),它包含应用程序中发生的所有事情的审计日志和其他事件。

下面是有关事件表的一些事实:

  • 它包含约300米行+一些组合/部分索引。
  • account_id对事件的统计非常不均衡,5%的帐户拥有50%的数据。
  • 有一个时间戳字段和一些其他字段(JSONB、author_id等)
  • 写操作:大部分插入和删除(每个account_id)。删除可能是数以百万计的行。没有最新消息。删除大型帐户是罕见的,目前还不是一个很大的性能问题。
  • 选择是特定事件(由account_id +id选择)或给定时间内的所有事件。时间并不总是固定的。查询中始终存在account_id

Possible解决方案

account_id划分:

优点:

  • 删除将是快速的,因为DROP TABLE
  • 查询也应该相当不错,因为所有查询都包含WHERE account_id = 123

缺点:

  • 对于Postgres来说,1000个分区太多了吗?
  • 每个帐户事件分布不均,创建了几个超级大分区和几个小分区。

按时间戳进行分区:

优点:

  • 最近的数据通常大部分是被访问的,并且使用时间戳会使查询更快。
  • 事件的更可预测/更均匀的分布。

缺点:

  • 删除单个帐户可能会影响很多分区--这不是什么大问题。
  • 总是需要按时间戳包含一个过滤器--这并不总是可能的。
EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-04-19 08:59:13

分区主要是关于加速删除和顺序扫描。

  • 如果您最大的痛苦是account_id的大删除,那么该列上的列表分区将是最好的解决方案。
  • 如果您最大的痛苦是摆脱所有早于某一日期的数据,按时间划分范围将是解决方案。
  • 如果您有一些查询,这些查询必须对大型表执行顺序扫描,但在account_id上具有D8条件或时间约束,则在该WHERE条件下进行分区将允许PostgreSQL只对某些分区执行顺序扫描。

您必须决定这些事情中的任何一件是否足以让您考虑分区。分区并不是免费的:它将增加查询规划时间,有时还会增加执行时间。

分区不会使索引扫描速度更快,通常情况正好相反。只有当您期望从分区中获得真正的利益时,才进行分区。

1000个分区几乎太多了,效率很低。您可能会考虑为更大的帐户拥有单独的分区,并将其余的部分捆绑起来,也许使用默认的分区。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/235108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档