And*_*Wei 2 postgresql index index-tuning postgresql-9.4
在 Postgres 9.4.11 数据库中,我有一个很大的图书表,它与作者是一对多的关系。从理论上讲,为了提高性能,我在电子书记录中缓存了作者姓名以便快速搜索。列的属性authors_cache:
示例行:
我在此列上创建了 GIN 索引:
CREATE INDEX "index_ebooks_on_authors_cache" ON "ebooks" USING gin ("authors_cache")
Run Code Online (Sandbox Code Playgroud)
它在搜索时不使用索引authors_cache并且花费了不可接受的时间:
EXPLAIN ANALYZE
SELECT * FROM "ebooks"
WHERE ('Charles Bukowski' = ANY (authors_cache))
LIMIT 60 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)
结果:
CREATE INDEX "index_ebooks_on_authors_cache" ON "ebooks" USING gin ("authors_cache")
Run Code Online (Sandbox Code Playgroud)
10 秒不是可接受的时间。我对设计更改持开放态度,因为我还没有与本专栏“结婚”。
使用GIN 索引支持的数组运算符。该= ANY ()结构是没有的。
SELECT *
FROM ebooks
WHERE authors_cache @> '{Charles Bukowski}' -- array literal
LIMIT 60;
Run Code Online (Sandbox Code Playgroud)
详细解释:
不确定你的去规范化会给你带来很多好处。带有简单 btree 索引的标准 1:n 实现也应该表现良好。
如果您采用这种方法,我会考虑int[]使用 author_id存储一个整数 ()数组。显着更小的数组列和 GIN 索引。参照完整性的潜在问题大致相同。(数组元素目前不能有 FK 约束。到目前为止,在 Postgres 中实现这一点的尝试没有成功。)
哦,考虑升级。自 Postgres 9.4 以来,GIN 索引的性能得到了显着提高。
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |