Postgres中的不区分大小写索引,处理大小写敏感的查询?

17

如果我将users.email上的普通唯一索引更改为不区分大小写的唯一索引,创建以下索引:

CREATE UNIQUE INDEX user_email_ci_idx ON users ((lower(email)));

是否有任何理由不删除先前的区分大小写索引?

我猜Postgres会切换到新索引,性能应该等同吧?

1个回答

13
新的索引只能用于基于索引表达式的条件。
...
WHERE lower(email)  = 'abc@foo.org'  -- search string in lower case.

只要你记住这一点,就可以放弃旧的区分大小写的索引。
或者你可以看看三元组索引,它们一开始就是不区分大小写的。
参见:

三元组索引只对类似于“like”、“ilike”和部分字符串搜索有帮助。如果我的用例是查找不区分大小写的精确匹配,那么三元组索引是否仍然比lower/upper索引更好? - Andrew James Ramirez
1
@AndrewJamesRamirez:只针对不区分大小写的相等条件,选择在表达式上显示的btree索引而非trigram索引。通常更有效 - 从一开始就比trigram GIN或GiST索引要小得多。在Postgres 13(目前是RC)中进行去重操作时效果更好。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接