sql 模糊查询_like查询语句索引使用

c8b5c71d9e135c5ad87ef18093f4468c.png
  • 数据准备
  • like查询案例分析
  • 问题优化
  • 案例总结

一、数据准备

使用索引可以提高数据库查询的速度,但是在like查询语句中索引又该怎么使用呢?不妨通过sql的执行计划来看下:

创建一张表:

3f724a14bcc41a9a852d8b74352feb54.png

创建复合索引:

856d7a562e9f84a8d7242b80964c1948.png

二、like查询案例分析

explain select name,age,sex from t_user where name like '%楠%'

c1b293ea9b61873667ab52b6c784118a.png

我们从执行计划中可以看到 '%楠%' 模糊匹配的sql查询语句采用的是全表扫描,并没有使用到索引;

explain select name,age,sex from t_user where name like '楠%';

1e35f12c493928cbd294dbbef2ebe564.png

从执行计划中可以看出'楠%' 模糊匹配的sql查询语句查询时使用了我们创建的索引并且类型为range;

explain select name,age,sex from t_user where name like '%楠';

ca67942f727ab274c146578e522ae468.png

从执行计划中可以看到 '%楠' 模糊匹配的sql查询语句采用的是全表扫描,并没有使用到索引;

案例结果:结论上看模糊匹配 '%x%' '%x' 的查询语句都不会用到我们创建的索引,只有 'x%'的方式索引才有效;技术的角度上说模糊查询尽量使用'x%' 的方式来避免索引失效;但是在实际的开发中并不是这样,'%x%' 恰恰是我们在开发中使用频次最高的一个模糊匹配方式,我们并不会因为 '%x%' 性能问题而去牺牲产品逻辑;那么该如何避免因使用 '%x%' 导致的索引失效呢?

三、问题优化

重新创建覆盖索引 idx_t_user_name_age_sex

070a399cb96c2eb30be0bf97f63c4388.png
explain select name,age,sex from t_user where name like'%楠%';

9aefab92b97ca7913f6f0e8c2a222213.png

再看下我们的执行计划,这次 '%楠%' 查询不在是全表扫描,而是用到了我们新创建的索引idx_t_user_name_age_sex;

explain select name,age,sex from t_user where name like'楠%';

8a453b43c935fd406470d01d07123e42.png

执行计划中发现 '楠%' 模糊查询使用到的索引并没有变化;

explain select name,age,sex from t_user where name like'%楠';

f279fafae5fbb54f4b6d0631ba233fa8.png

这次 '%楠' 查询也不是全表扫描,也用到了我们新创建的索引idx_t_user_name_age_sex;

四、案例总结

我们使用模糊查询时, '%x%' '%x' 有可能会使索引失效,我们可以采用创建覆盖索引的方式来解决我们模糊查询索引失效的问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值