加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL索引怎么用?4个点让你秒懂!

发布时间:2023-01-05 08:00:59 所属栏目:MySql教程 来源:转载
导读: 一、前言
在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;

三、哪些条件能用到索引

MySQL 索引_mysql in or 索引_mysql删除索引

图中一共分了三个部分:

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 索引_mysql删除索引_mysql in or 索引

我这边整理了一份:Mysql索引核心资料以及脑图,Java的系统化资料,(包括Java核心知识点、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以关注公众号【程序媛小琬】即可获取。

mysql删除索引_mysql in or 索引_MySQL 索引

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!