PostgreSQL Hstore键值对与传统SQL的性能对比

9
我需要开发一个键值后端,类似于这样的东西:
Table T1 id-PK, Key - string, Value - string
INSERT into T1('String1', 'Value1')
INSERT INTO T1('String1', 'Value2')

Table T2 id-PK2, id2->external key to id
some other data in T2, which references data in T1 (like users which have those K/V etc)

我听说过带有GIN/GIST的PostgreSQL hstore。在性能方面,哪个更好?传统的SQL连接和拥有单独的列(键/值)是一种方法,那么在这种情况下使用PostgreSQL hstore是否更好?
数据格式应为任何键=>任何值。我还想进行文本匹配,例如部分搜索(在SQL中使用LIKE %或使用hstore等效项)。我计划在其中拥有大约1M-2M条目,并可能在某些时候进行扩展。
你推荐什么?走SQL传统方式/PostgreSQL hstore或任何其他具有持久性的分布式键/值存储?
如果有帮助的话,我的服务器是一个1-2GB RAM的VPS,因此硬件不太好。我也在考虑在其上添加缓存层,但我认为这会使问题变得更加复杂。我只想要2M条目的良好性能。更新将经常进行,但搜索更为频繁。
谢谢。

我认为你应该在serverfault.com上提出这个问题。 - uvesten
Postgres的邮件列表也不错,你可以在那里发布答案并获得积分。尝试访问http://archives.postgresql.org/pgsql-general/或者http://archives.postgresql.org/pgsql-performance/。 - ian
2个回答

10

你的问题不清楚,因为你没有明确你的目标。

关键在于索引(双关语)- 如果你处理大量的键,你希望能够以最少的查找次数检索到它们,而且不会拉出无关的数据。

简短的回答是你可能不想使用hstore,但我们来看看更详细的情况......

  • 每个id有许多键/值对(数百个以上)吗?不要使用hstore
  • 任何一个值是否包含大块文本(4kb以上)?不要使用hstore
  • 你想能够使用通配符表达式搜索键吗?不要使用hstore
  • 你想进行复杂的联接/聚合/报告吗?不要使用hstore
  • 你将更新单个键的值吗?不要使用hstore
  • 在一个id下有多个相同名称的键吗?不能使用hstore

那么hstore有什么用途呢?好吧,一个好的场景是如果你想为外部应用程序保存键/值对,你知道你总是想检索所有键/值,并且始终将数据保存为块(即,它从未就地编辑)。同时,您确实希望有一些灵活性,以便能够简单地搜索此数据,而不是将其存储在XML或JSON块中。在这种情况下,由于键/值对的数量很少,因此您可以节省空间,因为您正在压缩多个元组到一个hstore中。

考虑将此作为您的表:

CREATE TABLE kv (
  id /* SOME TYPE */ PRIMARY KEY,
  key_name TEXT NOT NULL,
  key_value TEXT,
  UNIQUE(id, key_name)
);

1
我认为设计规范性不够好。尝试使用更像这样的设计:
CREATE TABLE t1
(
  t1_id serial PRIMARY KEY,
  <other data which depends on t1_id and nothing else>,
  -- possibly an hstore, but maybe better as a separate table
  t1_props hstore
);

-- if properties are done as a separate table:
CREATE TABLE t1_properties
(
  t1_id int NOT NULL REFERENCES t1,
  key_name text NOT NULL,
  key_value text,
  PRIMARY KEY (t1_id, key_name)
);

如果属性很少,而且你不需要在连接或使用复杂的选择条件时频繁使用它们,那么hstore可能就足够了。Elliot列出了一些值得考虑的合理事项。
你提到用户,这表明这是不完整的,但你没有提供足够的信息来建议它们应该放在哪里。你可以在t1中使用数组,或者最好使用单独的表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接