我对findByUsernameIgnoreCase
查找和索引有以下疑问。
例如,我在username
表中有DB列users
(唯一索引),并且我希望区分大小写。
目前,所有记录都以大写字母表示。
问题是findByUsernameIgnoreCase(...)
是否使用索引?
按照规范,IgnoreCase的结果为where UPPER(username)=UPPER(?1)
,这使我对索引的顺序感到困惑。
答案 0 :(得分:1)
对于方法findBy...IgnoreCase("someName")
,Spring Data JPA生成如下所示的SQL:
select ... from users u where upper(u.username) = upper('someName')
因此,如果将其与索引一起使用,则应创建一个“ upper(username)”索引,如下所示:
create index index_users_username_upper on users (upper(username));
查询计划示例:
Bitmap Heap Scan on parents p (cost=83.17..8791.50 rows=5000 width=346) (actual time=0.024..0.024 rows=0 loops=1) Filter: (upper(username) ~~ 'SOMENAME'::text) -> Bitmap Index Scan on index_users_username_upper (cost=0.00..81.92 rows=5000 width=0) (actual time=0.022..0.022 rows=0 loops=1) Index Cond: (upper(name) = 'SOMENAME'::text) Planning time: 0.207 ms Execution time: 0.051 ms
我认为在这种情况下不一定要大写存储username
...
您始终可以创建自己的查询方法来匹配您的条件,例如:
@Query("select u from User u where upper(u.username) = ?1")
List<User> findByUsernameIgnoreCase(string name);
在这种情况下,您可以通过username
使用简单索引。