巧用覆盖索引提升like查询效率

        大家都知道最左前缀匹配原则,因此在使用模糊查询的过程中,会尽量避免使用右匹配和左右匹配,对于右匹配的场景,可以采用将需要模糊查询的字段,截取后面固定长度的字符串单独字段保存,并建立索引的方式来优化询效率,例如订单号,可以截取6到9位保存在short_order_no字段中,既能满足模糊查询要求,又方便业务操作。但在某些业务场景中,我们又不可避免会用到左右匹配查询,像商品名称、优惠券名称等,这种情况下直接用like '%xx%'是走不了索引的。

以表tbl_coupons2为例,id字段为主键,我们先在coupons_name字段建个索引,看下coupons_name like '%test%'的查询计划和执行时间:

可以看到,查询走的是全表扫描。接下来我们改下查询语句的写法,看下查询计划和执行时间:

可以看到查询分别走了主键索引和coupons_name字段索引,查询效率有明显提升。

什么是覆盖索引

  • 解释一:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

  • 解释二:索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。

  • 解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。

  • 覆盖索引可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作,从而提升了查询性能。

利用覆盖索引优化查询步骤

第一步:为要使用like '%xx'或like '%xx%'的列创建单独索引;

第二步:以该列为like查询条件查询主键列(与该列),并将该子查询作为一张结果表;

第三步:将结果表与原表用主键列建立内连接;

第四步:其它查询限制条件使用原表字段进行限制。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值