postgresql 在不属于唯一合并索引的列上创建索引

7gcisfzg  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(154)

我有这样一个表,它有一个'unique together'索引:

CREATE TABLE IF NOT EXISTS entity_properties
(
    entity_id INTEGER NOT NULL REFERENCES entities,
    property_id UUID NOT NULL REFERENCES properties,
    value VARCHAR,
    value_label VARCHAR,
    UNIQUE (entity_id, property_id)
);

我想在"value"列上创建索引以最大限度地缩短搜索时间:

CREATE INDEX index_property_value ON entity_properties (value)

我得到这个错误:
索引行需要8296字节,最大大小为8191
正如错误中明确指出的那样,创建此索引将超过最大限制大小。
You can see this answer.
但我真的需要'值'列被索引的效率原因。在我的数据库中,这个表持有最大部分的数据(数百万行)。而且它得到更新非常频繁。据我所知,更新索引列会影响性能。这就是为什么我关心性能
我怎样才能做到这一点?
PS:我的另一个想法是,我可以将"值"列添加到"唯一在一起"索引中。

CREATE TABLE IF NOT EXISTS entity_properties
(
    entity_id INTEGER NOT NULL REFERENCES entities,
    property_id UUID NOT NULL REFERENCES properties,
    value VARCHAR,
    value_label VARCHAR,
    UNIQUE (entity_id, property_id, value)
);

这是否一个解决办法?如果是,这是否最佳办法?如果不是,最佳办法是什么

kpbwa7wx

kpbwa7wx1#

PostgreSQL有一个内置的哈希索引类型,它不受这个限制,所以你可以只创建其中之一:

CREATE INDEX index_property_value ON entity_properties using hash (value)

这样做的优点(与Laurenz建议的使用函数索引相比)在于您不需要以不自然的方式编写查询。
但是,“value”列可以包含这么大的值,这合理吗?也许最好的解决方案是调查大数据,如果不合理,则将其清理。
尝试将此列作为另一列添加到现有的唯一索引中只会使情况变得更糟,它仍然需要8296字节,其他列需要更多字节

55ooxyrt

55ooxyrt2#

搜索长文本是一个不常见的要求。为了避免错误并获得有效的索引访问,请使用列的散列:

CREATE INDEX ON entity_properties (hashtext(value));

这可以与以下查询一起使用

SELECT ...
FROM entity_properties
WHERE value = 'long string'
 AND hashtext(value) = hashtext('long string');

第一个条件是处理散列冲突所必需的。

相关问题