我有一个带有users表的postgresql数据库,其中每个用户都有一个名字(在unicode中)。我想找到名字中包含至少一个希伯来字符的所有用户。我曾想过使用regex,例如
select * from users
where name ~ '[א-ת]';
是否有比正则表达式更有效的方法?我在名称列上有一个B树索引。
更新
@FuzzyTree将pg_trgm
模块的不同索引用作suggested
B-tree GIST GIN
user 0.04 0.04 0.03
sys 0.02 0.04 0.01
total 0.06 0.08 0.04
关于磁盘大小,GIN索引是GIST索引的0.2倍,也是B树的0.8倍。所以,我们在这里有一个胜利者,至少在我的用例中。 YMMV(例如我没有基准索引创建和更新)。版本:postgres 9.6。
答案 0 :(得分:1)
一个选项是创建一个布尔列,即is_hebrew_name
,您可以使用正则表达式更新一次并创建常规索引。
如果您不想添加其他列并且您正在运行v9.3或更高版本,请考虑使用pg_trgm
模块创建GIN
或{{1 GIST
name
pg_trgm模块提供了GiST和GIN索引操作符类 允许您为文本列创建索引 非常快速的相似性搜索这些索引类型支持 上述相似度运算符,以及另外的支持 基于trigram的索引搜索LIKE,ILIKE,〜和〜*查询。
索引搜索的工作原理是从常规中提取三元组 表达式,然后在索引中查找这些。三卦越多 可以从正则表达式中提取,效果更好 索引搜索是。与基于B树的搜索不同,搜索字符串 不需要左撇子。
对于LIKE和正则表达式搜索,请记住a 没有可提取的三元组的模式将退化为完整索引 扫描。
GiST和GIN索引之间的选择取决于相对值 讨论了GiST和GIN的性能特征 别处。
有关详细信息,请参阅https://www.postgresql.org/docs/9.6/static/pgtrgm.html