天天看点

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

作者:时光眼影

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

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

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

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

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

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

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

什么是覆盖索引

  • 解释一:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
  • 解释二:索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
  • 解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
  • 覆盖索引可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作,从而提升了查询性能。

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

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

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

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

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

继续阅读