gpt4 book ai didi

postgresql - Text[] 数组列的表索引

转载 作者:行者123 更新时间:2023-11-29 11:35:27 25 4
gpt4 key购买 nike

我有一个 PostgreSQL 数据库表,上面定义了 text[](数组)列。我正在使用这些列以这种方式在数据库中搜索特定记录:

select obj from business
where ((('street' = ANY (address_line_1)
and 'a_city' = ANY (city)
and 'a_state' = ANY (state))
or ('street' = ANY (address_line_1)
and '1234' = ANY (zip_code)))
and ('a_business_name' = ANY (business_name)
or 'a_website' = ANY (website_url)
or array['123'] && phone_numbers))

我遇到的问题是,对于大约 100 万条记录,查询变得非常慢。我的问题很简单,数组列有不同类型的索引吗?有人知道在这种情况下创建的最佳索引类型吗? (假设有不同的类型)。

以防万一,这是 explain analyze 响应:

"Seq Scan on business  (cost=0.00..207254.51 rows=1 width=32) (actual time=18850.462..18850.462 rows=0 loops=1)"
" Filter: (('a'::text = ANY (address_line_1)) AND (('a'::text = ANY (business_name)) OR ('a'::text = ANY (website_url)) OR ('{123}'::text[] && phone_numbers)) AND ((('a'::text = ANY (city)) AND ('a'::text = ANY (state))) OR ('1234'::text = ANY (zip_code))))"
" Rows Removed by Filter: 900506"
"Total runtime: 18850.523 ms"

提前致谢!

最佳答案

您可以使用 GIN index有效地提高数组的性能。
array operators 结合使用.

例如:

CREATE INDEX business_address_line_1_idx ON business USING GIN (address_line_1);

对条件中涉及的所有数组列执行此操作。

可能值得考虑规范化您的架构。也许将多个条目拆分成一个单独的(1:n 或 n:m)表会更好。从长远来看,它通常会起作用,即使一开始看起来需要更多工作。

关于postgresql - Text[] 数组列的表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14571107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com