25 mysql like 是否使用索引

前言

这里主要是 探究一下 explain $sql 中各个 type 

诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 

这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 

以及 相关的差异 

此系列文章建议从 mysql const 查询 开始看

 

测试表结构信息如下 

 
CREATE TABLE `tz_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `field1` varchar(12) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3333343 DEFAULT CHARSET=utf8

 

测试数据为序列 1 – 99

25 mysql like 是否使用索引_第1张图片

 

 

like 通配符的位置造成的影响 

执行 sql 如下 “select * from tz_test where field1 like '%field2';”

可以看出, 扫描的是全表 

25 mysql like 是否使用索引_第2张图片

 

执行 sql 如下 “select * from tz_test where field1 like 'field%2';”

可以看出, 扫描的是全表 

25 mysql like 是否使用索引_第3张图片

 

执行 sql 如下 “select * from tz_test where field1 like 'field2%';”

可以看出, 扫描的是部分索引, 这个也是结合了 索引是按照顺序存储的规则来计算的优化

25 mysql like 是否使用索引_第4张图片

 

 

“like 1%” 转换为了 range 查询 

这里从 key_tree 中将数据转换到 PARAM->max_key, 然后 之后更新到传入的 range 中, 以供后面查询使用 

25 mysql like 是否使用索引_第5张图片

 

具体的存储的地方是在这里, 将 key_tree 的数据存储到 PARAM->max_keys 中

25 mysql like 是否使用索引_第6张图片 

数据从 PARAM 转换到 range 中, 后面的查询是使用的这个 range 

25 mysql like 是否使用索引_第7张图片 

然后 key_tree 的数据来自于 条件的解析 25 mysql like 是否使用索引_第8张图片 

具体的range最大最小边界的 padding 方式如下, 使用 c->min_sort_char, c->max_sort_char 来进行补齐, 这里 c 为 utf8_general_ci

c->max_sort_char 转换为字节序列是就是 0xefbfbf

25 mysql like 是否使用索引_第9张图片

 

 

进而将如下模糊查询转换为了范围查询

select * from tz_test where field1 like 'field2%';

select * from tz_test where field1 >= 'field2\x0\x0...\x0' and field1 <= 'field2\xef\xbf...\xbf';

 

 

完 

 

 

 

你可能感兴趣的:(12,mysql,mysql,index,like)