我有一个 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"
提前致谢!
您可以使用杜松子酒指数 http://www.postgresql.org/docs/current/static/gin.html有效提高阵列性能。
结合使用它数组运算符 http://www.postgresql.org/docs/current/static/functions-array.html.
例如:
CREATE INDEX business_address_line_1_idx ON business USING GIN (address_line_1);
对条件中涉及的所有数组列执行此操作。
可能值得考虑标准化您的架构。也许将多个条目拆分到一个单独的(1:n 或 n:m)表中会更好。从长远来看,这通常是有效的,即使一开始看起来需要做更多的工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)