测试表USER_INFO表数据以及结构如下:
有一个USER_NAME字段的索引:
有个业务需求,需要模糊搜索出用户名后几位有杰这个词的所有用户信息,这时候不可能说为了一个搜索就引入ES,但是如果sql使用左模糊查询的话,根据索引的最左匹配原则,该sql语句是不可能使用到idx_user_name索引的,如下:
EXPLAIN SELECT * from USER_INFO where USER_NAME like '%杰'
- 1
执行计划如下:
可以发现是用不到索引的。
需要做模糊匹配,又要用到索引,索引的最左匹配原则更是不能被打破,这时候可以增加一个字段,这个字段的内容等于USER_NAME字段内容的反转,同时加上这个字段的相关索引,如下:
此时如果是要模糊搜索出用户名后几位有杰这个词的所有用户信息,可以对REVERSE_USER_NAME字段做右模糊查询,效果其实就是和对USER_NAME字段做左模糊查询是一样的,因为二者的内容是相反的,结果如下:
SELECT * from USER_INFO where REVERSE_USER_NAME like '杰%'
- 1
执行计划如下:
总结
索引的最左匹配原则不能打破,那么要让左匹配也走索引的话,换个思路,让右匹配的效果和左匹配一样就好了,同时右匹配又能走索引,间接达到了左模糊查询也能走索引的目的。
转载:https://blog.csdn.net/weixin_38106322/article/details/106583450#comments_14264663