10 分钟让你明白 MySQL 是如何利用索引的
SQL高级知识第二版
一、前言
MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢? MySQL 到底在怎么样的情况下能够利用索引进行排序?
二、知识补充
key_len
一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes; 如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes; 若该列类型定义时允许NULL,其key_len还需要再加 1 bytes; 若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes;
三、哪些条件能用到索引

Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。 Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。 Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。
Index Key
注:这里简单的记忆是,如果比较符号中包含’=’号,’>=’也是包含’=’,那么该索引键是可以被利用的,可以继续匹配后面的索引键值;如果不存在’=’,也就是’>’,’<’,这两个,后面的索引键值就无法匹配了。同时,上下边界是不可以混用的,哪个边界能利用索引的的键值多,就是最终能够利用索引键值的个数。
Index Filter
注:这里简单的记忆是,如果比较符号中包含’=’号,’>=’也是包含’=’,那么该索引键是可以被利用的,可以继续匹配后面的索引键值;如果不存在’=’,也就是’>’,’<’,这两个,后面的索引键值就无法匹配了。同时,上下边界是不可以混用的,哪个边界能利用索引的的键值多,就是最终能够利用索引键值的个数。
Index Filter
Table Filter
四、Between 和 Like 的处理
Between
where c1 between 'a' and 'b'
等价于 where c1>='a' and c1 <='b'
,所以进行相应的替换,然后带入上层模型,确定上下边界即可。Like
where c1 like '%a'
这样的查询是无法利用索引的,因为索引的匹配需要符合最左前缀原则where c1 like 'a%'
其实等价于 where c1>='a' and c1<'b'
大家可以仔细思考下。五、索引的排序
Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index – in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated.

select c1,c2,c3 from t1;
查询走的是索引全扫描,因此呈现的数据相当于在没有索引的情况下select c1,c2,c3 from t1 order by c1,c2,c3;
的结果c1=3,c2=2 — > c3 有序
c1 in(1,2) —> c2 无序 ,c3 无序
有个小规律,idx_c1_c2_c3,那么如何确定某个字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二个位置,只有在c1 唯一确定一个值的时候,c2才是有序的,如果c1有多个值,那么c2 将不一定有序,同理,c3也是类似
六、小结

赞 (0)