MySQL中like查询是否会使用索引

explain查看执行计划

首先介绍一下mysql explain的各项内容:

序号名称含义备注
1id查询的IDID相同从上往下执行,ID不同,越大越先执行
2select_type查询类型SIMPLE 简单查询
PRIMARY 最外层的查询
Union
SUBQUERY 子查询。
还有很多类型可以看官方文档 https://dev.mysql.com/doc/refman/5.6/en/explain-output.html
3table
4partitions匹配分区
5type连接类型system:表为空或只有一行
const:查询结果就只有一行,这样msql优化器就能把这一行当成常量处理,一般只有用主键/唯一索引查的时候出现
eq_ref:在当前表中只能找到一行与前面的查询结果一一匹配,一般是用主键或惟一索引进行连接,用=符号
ref:在当前表中可以找到多行与前面的查询结果一一匹配,一般是用主键的最左前缀或非唯一索引,用=, > , < 符号
full_text:用fulltext索引时使用
ref_null:和 ref很像,就是多搜索一个null条件
index_merge: 用到了不止一个索引,mysql做了优化
range:用于范围查询,包括like。Index:索引全表扫描;1.覆盖索引,只需要扫描全部索引,无需回表;
ALL:全表扫描
6possible_keys可能选择的索引
7key实际选择的索引实际选择的索引可能并不在possible_keys中,(这种情况是mysql发现你查的是个覆盖索引,扫描索引比扫描全表要好)
8key_len选择的索引的长度主要是联合索引看看用到了多少
9ref与索引相比较的列const:用的常数
func:用的函数
10rows预估扫描行数
11filtered查询条件过滤后占的百分比只对index和all类型的查询生效,其他类型都为100%,可以看下这个文章http://blog.chinaunix.net/uid-20726500-id-5573764.html
12Extra额外信息介绍

实验过程

  1. 先建立一个表,如下图所示
    在这里插入图片描述
  2. 在loacation_path添加索引后进行单条件,全部数据的查询
  • like xxx%查询
explain select * from location where loaction_path like '中国%

查询结果
在这里插入图片描述
可以看出ID为1 没什么好说的,然后是simple的查询,用到的表为location,分区为null,连接的类型是range(因为是用like查询的),possible_keys为可以使用的location_path列上的索引,最终使用的也是这个key,key_length = 1020,这个是怎么算的呢?
先看下表的列的类型和字符集:
在这里插入图片描述
Location_path这一列是char(255),uft8mb4_0900_ai_ci正好对于每个字符用4个字节存储:4*255 = 1020; 如果loation_path 允许为null,则还需要多一个字节存储null,key_length会为1021,使用了索引进行查询,扫描行数为6行,使用了索引。

  • like %xxx查询
explain select * from location where loaction_path like '%/浦东新区’

在这里插入图片描述
这个则没有使用索引

  • like %xxx%查询
explain select * from location where loaction_path like '%/上海市/%

在这里插入图片描述
这个也没有使用索引查询

  1. 分析

如果前缀为%,索引不知道应该如何匹配,所以不会用到

  1. 进行单条件,查询单个属性的查询
explain select loaction_path from location where loaction_path like '%上海市%

在这里插入图片描述
发现使用了索引,但是过滤的行数还是7行,possible_keys为空,也就是估计没用索引,但是实际查询时候发现是覆盖索引的查询,所以用上了。

Like 不走索引的优化

  1. 使用LOCATE
SELECT *  FROM location WHERE LOCATE('上海市', location_path);

benchmark对比如下:看起来查不了多少,基本上一样(也可能和数据量有关系,毕竟表里面就几条数据)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值