我正在使用PostgreSQL
版本9.3。
我刚刚了解到普通b-tree
索引不能用于&x 39; x%x%x'通配符,我找到gist
和gin
索引,使我的通配符像查询一样到达索引。
所以我决定使用这些索引并使用PostgreSQL中的命令添加btree-gist
扩展名;
CREATE EXTENSION btree_gist;
之后我将我的gist索引添加到我的表中,就像是;
CREATE INDEX ix_bras_interface_name ON bras_interface USING GIST (name);
在我添加之后,我可以看到它真的被添加了;
table_name | index_name | column_name
----------------+-------------------------------------------+-------------------
bras_interface | bras_interface_context_id | context_id
bras_interface | bras_interface_domain_id | domain_id
bras_interface | bras_interface_managed_object_id | managed_object_id
bras_interface | bras_interface_name_59ec675d0b9537ac_uniq | context_id
bras_interface | bras_interface_name_59ec675d0b9537ac_uniq | name
bras_interface | bras_interface_name_idx | name
bras_interface | bras_interface_pkey | id
bras_interface | bras_interface_task_id | task_id
**bras_interface | ix_bras_interface_name | name**
(9 rows)
但是,我的简单查询仍未达到索引。这是我的简单查询及其分析结果;
my_user=# explain ANALYZE select * from bras_interface where name like '%my_text%';
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Seq Scan on bras_interface (cost=0.00..764.95 rows=1 width=1420) (actual time=5.589..5.589 rows=0 loops=1)
Filter: ((name)::text ~~ '%my_text%'::text)
Rows Removed by Filter: 27596
Total runtime: 5.613 ms
(4 rows)
我认为它没有达到指数。我按照教程了解并且无法看到解决方案,甚至是问题。 我对gist索引缺少什么?
答案 0 :(得分:0)
就像a_horse_with_no_name所说,你选择了错误的扩展名。
btree_gist扩展名允许您使用索引来支持"距离"运营商。它还允许您有一个跨越多列的gist索引,其中一个可能是例如一个tsearch矢量和另一个简单的int。
pg_trgm扩展名是匹配任意位置字符串索引的扩展名。请注意,它是一个相当昂贵的索引。