3

我正在寻求建议。我从未使用过分片,但最近阅读了一些关于它的内容,我怀疑它应该有助于我在数据库(PostgreSQL 9.1)中长时间执行查询。

描述

  • 我有posts2 亿行的表。
  • 每个帖子都有表的外键projects
  • 每个项目在帖子表中有 100 到 300,000 行(平均:30,000)
  • 通常我在外键上与项目表连接的帖子表上执行查询projects_id
  • 我很少与其他表中的页面执行连接。

对于页面中超过 100,000 行的项目,我的查询(检索在给定时间段内添加的帖子和聚合)非常慢。

我应该使用分片吗?

如果是:

  • 我应该如何分片?我应该projects_id在页表中使用作为键吗?
  • 分片表页面(创建posts_1,posts_2 ...表)是否足够?
  • 我应该在一台机器上使用多个磁盘(分区)(各种磁盘上的分片表)吗?

如果不:

我应该使用什么来代替分片?我购买了具有更快磁盘(SAS)的服务器;它有帮助,但还不够。我尝试使用主从(使用 pgPool2),但是当我想在从数据库上执行更长的查询时,我收到以下错误:

错误:由于与恢复冲突而取消语句详细信息:用户查询可能需要查看必须删除的行版本。

关于分片的详细问题:

  • 我应该在每个分片表中有多少行(posts_1,posts_2 ...)
  • PostgreSQL 中分片的最佳解决方案/工具是什么?PL/代理?
4

1 回答 1

2

如果没有彻底的瓶颈分析和所需的系统用例,就很难说清楚。你从来没有确切地说它的运行速度有多慢。

我会给你几个选项来考虑而不是分片:

  1. 使用Solr等搜索引擎进行常见查询(例如最近的)
  2. 使用计数器表或使用Redis 之类的东西进行统计聚合(帖子数)
  3. 使用消息队列(Redis (pub/sub) 或RabbitMQ)来限制数据库写入
  4. 缓存,缓存,缓存
  5. 最后也许考虑一个 NoSQL 选项(非常怀疑你需要这样做)

如果您至少没有完成我提到的 3/5 选项,您可能不应该进行分片并查看替代方案。特别是 2 号,因为 Postgresql 的速度非常慢,例如:select count(*) from ....

于 2012-12-21T02:56:20.423 回答