MySQL索引怎么用?4个点让你秒懂!
在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。
譬如:
1.MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件?
2.MySQL 在
一、前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。 譬如: 1.MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? 2.MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢? 3.MySQL 到底在怎么样的情况下能够利用索引进行排序? 今天,我将会用一个模型,把这些问题都一一解答,让你对MySQL索引的使用不再畏惧 二、知识补充 key_len EXPLAIN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。 在这里 key_len 大小的计算规则是: 1.一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes; 2.如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes; 3.若该列类型定义时允许NULL,其key_len还需要再加 1 bytes; 4.若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes; 三、哪些条件能用到索引 图中一共分了三个部分: 1.Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。 2.Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。 3.Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。 Index Key Index Key是用来确定MySQL的一个扫描范围,分为上边界和下边界。 MySQL利用=、>=、> 来确定下边界(first key),利用最左原则,首先判断第一个索引键值在where条件中是否存在,如果存在,则判断比较符号,如果为(=,>=)中的一种,加入下边界的界定,然后继续判断下一个索引键,如果存在且是(>),则将该键值加入到下边界的界定,停止匹配下一个索引键;如果不存在,直接停止下边界匹配。 exp:idx_c1_c2_c3(c1,c2,c3)where c1>=1 and c2>2 and c3=1--> first key (c1,c2)--> c1为 '>=' ,加入下边界界定,继续匹配下一个-->c2 为 '>',加入下边界界定,停止匹配复制代码 上边界(last key)和下边界(first key)类似,首先判断是否是否是(=,','=1 and c2 c1index filter--> c2 c3复制代码 这里为什么index key 只是c1呢?因为c2 是用来确定上边界的,但是上边界的c1没有出现(=,c2没有出现,因此index key 只有c1字段。c2,c3 都出现在索引中,被当做index filter. Table Filter 无法利用索引完成过滤,就只能用table filter。此时引擎层会将行数据返回到server层,然后server层进行table filter。 四、Between 和Like 的处理 那么如果查询中存在between 和like,MySQL是如何进行处理的呢? Between where c1 between 'a' and 'b' 等价于 where c1>='a' and c1 ='a' and c1 c2 有序,c3 无序c1=3,c2=2 — > c3 有序c1 in(1,2) —> c2 无序 ,c3 无序复制代码 有个小规律,idx_c1_c2_c3,那么如何确定某个字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二个位置,只有在c1 唯一确定一个值的时候,c2才是有序的MySQL 索引,如果c1有多个值,那么c2 将不一定有序,同理,c3也是类似 六、小结 针对MySQL索引,我这边只是提到了在单表查询情况下的模型,通过这篇文章,想必大家应该了解到MySQL大部分情况下是如何利用索引的,如果存在疑问,欢迎联系我? 最后 关于MySQL的知识点总结了一个脑图,分享给大家 我这边整理了一份:Mysql索引核心资料以及脑图,Java的系统化资料,(包括Java核心知识点、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以关注公众号【程序媛小琬】即可获取。 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |