MySQL中like查询使用索引
explain查看执行计划实验过程Like 不走索引的优化explain查看执行计划
首先介绍一下mysql explain的各项内容:
实验过程
先建立一个表,如下图所示在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 '%/上海市/%’
这个也没有使用索引查询
分析
如果前缀为%,索引不知道应该如何匹配,所以不会用到
进行单条件,查询单个属性的查询
explain select loaction_path from location where loaction_path like '%上海市%’
发现使用了索引,但是过滤的行数还是7行,possible_keys为空,也就是估计没用索引,但是实际查询时候发现是覆盖索引的查询,所以用上了。
Like 不走索引的优化
使用LOCATESELECT * FROM location WHERE LOCATE('上海市', location_path);
benchmark对比如下:看起来查不了多少,基本上一样(也可能和数据量有关系,毕竟表里面就几条数据)