Django hstore 字段和索引

4

我正在使用Django 1.8和postgresql以及新的hstore字段。 我想对我的hstore字段中的值应用索引。 但是,阅读Postgres的文档后,我感到btree索引并不适合此处情况,因为我的hstore字段中有很多值,所有这些值都指向同一记录。 使用pgAdmin,我注意到如果我在我的hstore字段中添加db_index=True,则会创建一个btree索引。

  1. 在这种情况下,btree索引是否真的无用? 我不应该使用它吗?
  2. 我使用原始SQL(嵌入我的迁移文件中)创建了一个gin索引,我想知道这是否足够,我是否需要覆盖我的orm筛选/获取方法,以及这些方法是否可行。

原始SQL类似于:

SELECT * from transaction WHERE ("transaction"."hstorefield" -> 'service_code') = somevalue

我建议现在使用jsonb和PostgreSQL 9.4。我认为hstore越来越成为一项传统功能。至于索引,我认为你需要展示ORM运行的实际查询。 - Craig Ringer
SELECT * FROM transaction WHERE ("transaction"."hstorefield" -> 'service_code') = somevalue - elynch
1个回答

1

虽然GIN会显著减缓插入和更新速度,但它的效果还是很好的。

CREATE INDEX "ix_hsfield" ON "transaction" USING GIN ("hstorefield");

如果您只需要加速一个hstore键的查询,使用btree是可行的,并且会更快一些(并且在使用大于/小于运算符的查询上效果更好)。
CREATE INDEX "ix_hsfieldkey" ON "transaction" ((hs_data -> 'service_code'));

如果键包含数字数据,并且您想在where子句中与数字进行比较(小于/大于),请确保将索引编写为:
CREATE INDEX "ix_hsfieldkey" ON "transaction" ((hs_data -> 'service_code')::numeric);

-- the index won't be used unless the field used in the queries match the index:
SELECT * from transaction WHERE ("transaction"."hstorefield" -> 'service_code')::numeric = somevalue

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