巨大的表同时读写

时间:2011-08-10 13:09:06

标签: database postgresql data-structures

我在postgresql表中有几百万行。我有多达20个写入该表的过程(每秒几百个插入/更新),我有几个进程同时从它读取(一次大选择)。这导致双方的许多失败(流闭合,输入/输出错误),读写。

我现在考虑将该表拆分为多个表。我会通过对象的“类型”进行拆分,它基本上是一个只有20个可能值的字段,这些值是均匀分布的。

问题是,我应该使用多个表,多个模式还是多个数据库来保证对数据的非阻塞访问。或许我应该使用完全不同的设置。另一个数据库呢?也许HTable?

数据的完整性并不重要。它最终必须存在,但我真的不需要隔离级别或事务。我只需要一个快速系统,可以在不影响性能的情况下从多个进程进行写入和读取,并允许根据字段值进行查询。

现在我使用JDBC与隔离级别TRANSACTION_READ_UNCOMMITTED和每个进程的连接。

更新:

架构如下所示:

CREATE TABLE rev
(
  id integer NOT NULL,
  source text,
  date timestamp with time zone,
  title text,
  summary text,
  md5sum text,
  author text,
  content text,
  CONSTRAINT rev_id_pk PRIMARY KEY (id),
  CONSTRAINT md5sum_un UNIQUE (md5sum)
)

CREATE TABLE resp
(
  id integer NOT NULL,
  source text,
  date timestamp with time zone,
  title text,
  summary text,
  md5sum text,
  author text,
  content text,
  CONSTRAINT resp_id_pk PRIMARY KEY (id),
  CONSTRAINT md5sum_un UNIQUE (md5sum)
)

我在某些领域有一些索引。

示例查询如下所示:

SELECT * FROM rev LEFT JOIN resp ON rev.id = resp.parent_id WHERE rev.date > ? LIMIT 1000 OFFSET ?

resp表格要小得多,但它也会获得更新,并在连接中查询。

2 个答案:

答案 0 :(得分:3)

  

这会导致双方在阅读和写作方面出现许多失败。

什么样的失败?在PostgreSQL中读取和写入同一个表应该不是问题,MVCC工作正常。

很难告诉您如何在没有任何有关系统的信息以及进程正在执行的操作的情况下解决您的问题。你能告诉我们更多关于它的事吗?并显示数据库架构?

  

现在我使用JDBC与隔离级别TRANSACTION_READ_UNCOMMITTED

PostgreSQL中不存在

READ UNCOMMITTED,它被视为Read Committed

  

在PostgreSQL中,您可以请求任何四种标准交易   隔离级别。但在内部,只有两个截然不同   隔离级别,对应于Read Committed和   序列化。当你选择级别Read Uncommitted时,你真的   得到Read Committed,当你选择Repeatable Read时,你真的得到了   可序列化,因此实际的隔离级别可能比更严格   你选择了什么。

答案 1 :(得分:1)

我不确定获取可读数据有多少延迟,但您可能希望查看Slony Replication。实质上,您有一个带有从数据库的主数据库。所有插入/写入都将被放入主数据库,然后Slony会将这些新条目复制到从属数据库中(这需要一点时间,但没有什么是巨大的。也许几分钟。)。然后,您可以从从属数据库中专门读取您的应用程序。

如果Slony看起来不适合您,您可以查看一些“多主”替代方案here。这些将使您可以将多台计算机写入,并将所有内容复制到读取计算机上。