我应该使用分片吗?

时间:2012-12-20 22:15:29

标签: postgresql optimization partitioning sharding

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

描述

  • 我的表posts有2亿行。
  • 每个帖子都有projects表的外键。
  • 每个项目在帖子表中有100到300,000行(AVG:30,000)
  • 通常我在与projects_id外键上的项目表连接的posts表上执行queuries。
  • 我很少从其他人的表中执行联接。

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

我应该使用分片吗?

如果是:

  • 我应该怎么样?我应该在页面表中使用projects_id作为密钥吗?
  • 是否足以分页表页面(创建posts_1,posts_2 ...表格)?
  • 我应该在一台机器上使用多个磁盘(分区)(各种磁盘上的分片表)吗?

如果不是:

我应该使用什么而不是分片?我买了一台带有更快磁盘(SAS)的服务器;它帮助但不够。我曾尝试使用master-slave(使用pgPool2),但是当我想在slave数据库上执行更长的查询时,我收到以下错误:

  

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

有关分片的详细问题:

  • 每个分片表中应包含多少行(posts_1,posts_2 ...)
  • PostgreSQL中用于分片的最佳解决方案/工具是什么? PL /代理?

1 个答案:

答案 0 :(得分:2)

完整的瓶颈分析和系统的期望用例很难说清楚。你从未说过它的运行速度有多慢。

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

  1. 使用 Solr 等搜索引擎进行常见查询(例如最近的查询)
  2. 使用计数器表或使用 Redis 之类的内容进行统计汇总(num posts)
  3. 使用消息队列(Redis(pub / sub)或 RabbitMQ )来限制数据库写入
  4. 缓存,缓存,缓存
  5. 最后可能会考虑使用NoSQL选项(非常怀疑你需要这样做)
  6. 如果你还没有完成我提到的至少3/5选项,你可能不应该进行分片并查看备选方案。对于像select count(*) from ...这样的事情来说,特别是Postgresql的数字2非常慢。