给定一个字符串列,其值类似于/123/12/34/56/5/
,查询所有的最佳方式是什么包含给定编号的记录 (12
例如)?
我脑海中的解决方案是:
SELECT id FROM things WHERE things.path LIKE '%/12/%'
但据我所知,由于前导,此查询无法使用列上的索引%
.
一定有更好的东西。它是什么?
使用 PostgreSQL,但会prefer该解决方案也适用于其他数据库。
如果您愿意将该列转换为整数数组,例如:
'/123/12/34/56/5/' becomes ARRAY[123,12,34,56,5]
So that path_arr
是一列类型INTEGER[]
,然后您可以在该列上创建 GIN 索引:
CREATE INDEX ON things USING gin(path_arr);
对包含 12 的所有项目的查询则变为:
SELECT * FROM things WHERE ARRAY[12] <@ path_arr;
这将使用索引。在我的测试(一百万行)中,我得到如下计划:
EXPLAIN SELECT * FROM things WHERE ARRAY[12] <@ path_arr;
QUERY PLAN
----------------------------------------------------------------------------------------
Bitmap Heap Scan on things (cost=5915.75..9216.99 rows=1000 width=92)
Recheck Cond: (path_arr <@ '{12}'::integer[])
-> Bitmap Index Scan on things_path_arr_idx (cost=0.00..5915.50 rows=1000 width=0)
Index Cond: ('{12}'::integer[] <@ path_arr)
(4 rows)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)