一、前言

在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)类似,首先判断是否是否是(=,<=)中的一种,如果是,加入界定,继续下一个索引键值匹配,如果是(

exp:

idx_c1_c2_c3(c1,c2,c3)

where c1<=1 and c2=2 and c3<3--> last key (c1,c2,c3)

--> c1为 '<=',加入上边界界定,继续匹配下一个

--> c2为 '='加入上边界界定,继续匹配下一个

--> c3 为 '

注:这里简单的记忆是,如果比较符号中包含'='号,'>='也是包含'=',那么该索引键是可以被利用的,可以继续匹配后面的索引键值;如果不存在'=',也就是'>','

Index Filter

字面理解就是可以用索引去过滤。也就是字段在索引键值中,但是无法用去确定Index Key的部分。

exp:

idex_c1_c2_c3

where c1>=1 and c2<=2 and c3 =1index key --> c1

index filter--> c2 c3

这里为什么index key 只是c1呢?因为c2 是用来确定上边界的,但是上边界的c1没有出现(<=,=),而下边界中,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 <='b',所以进行相应的替换,然后带入上层模型,确定上下边界即可

Like

首先需要确认的是%不能是最在最左侧,where c1 like '%a' 这样的查询是无法利用索引的,因为索引的匹配需要符合最左前缀原则

where c1 like 'a%' 其实等价于 where c1>='a' and c1

五、索引的排序

在数据库中,如果无法利用索引完成排序,随着过滤数据的数据量的上升,排序的成本会越来越大,即使是采用了limit,但是数据库是会选择将结果集进行全部排序,再取排序后的limit 记录,而且MySQL 针对可以用索引完成排序的limit 有优化,更能减少成本。

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.

CREATE TABLE `t1` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `c1` int(11) NOT NULL DEFAULT '0',  `c2` int(11) NOT NULL DEFAULT '0',  `c3` int(11) NOT NULL DEFAULT '0',  `c4` int(11) NOT NULL DEFAULT '0',  `c5` int(11) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`),

KEY `idx_c1_c2_c3` (`c1`,`c2`,`c3`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4

select * from t1;

+----+----+----+----+----+----+| id | c1 | c2 | c3 | c4 | c5 |

+----+----+----+----+----+----+

|  1 |  3 |  3 |  2 |  0 |  0 ||  2 |  2 |  4 |  5 |  0 |  0 |

|  3 |  3 |  2 |  4 |  0 |  0 ||  4 |  1 |  3 |  2 |  0 |  0 |

|  5 |  1 |  3 |  3 |  0 |  0 ||  6 |  2 |  3 |  5 |  0 |  0 |

|  7 |  3 |  2 |  6 |  0 |  0 |+----+----+----+----+----+----+7 rows in set (0.00 sec)

select c1,c2,c3 from t1;

+----+----+----+| c1 | c2 | c3 |+----+----+----+|  1 |  3 |  2 ||  1 |  3 |  3 ||  2 |  3 |  5 ||  2 |  4 |  5 ||  3 |  2 |  4 ||  3 |  2 |  6 ||  3 |  3 |  2 |+----+----+----+7 rows in set (0.00 sec)

存在一张表,c1,c2,c3上面有索引,select c1,c2,c3 from t1; 查询走的是索引全扫描,因此呈现的数据相当于在没有索引的情况下select c1,c2,c3 from t1 order by c1,c2,c3; 的结果 因此,索引的有序性规则是怎么样的呢?

c1=3 —> c2 有序,c3 无序

c1=3,c2=2 — > c3 有序

c1 in(1,2) —> c2 无序 ,c3 无序

复制代码

有个小规律,idx_c1_c2_c3,那么如何确定某个字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二个位置,只有在c1 唯一确定一个值的时候,c2才是有序的,如果c1有多个值,那么c2 将不一定有序,同理,c3也是类似

六、小结

针对MySQL索引,我这边只是提到了在单表查询情况下的模型,通过这篇文章,想必大家应该了解到MySQL大部分情况下是如何利用索引的,如果存在疑问,欢迎联系我?

最后

今天关于MySQL的知识点就总结到这里了,我自己也总结了一MYSQL的知识脑图和资料,需要的朋友,可以在评论区后私信留言mysql资料 获取哦!

mysql索引linke和等于_MySQL索引怎么用?秒懂只需四个点!相关推荐

  1. mysql索引linke和等于_MySQL索引的学习

    MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...

  2. mysql索引linke和等于_MySQL索引介绍和实战

    索引是什么 mysql官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以得到索引的本质:索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词 ...

  3. mysql索引linke和等于_MySQL之SQL优化详解(三)

    摘要: 致索引失效而转向全表扫描存储引擎不能使用索引中范围条件右边的列mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描isnull,isnotnull也无法使用索引l ...

  4. mysql 搜索不等于_Mysql索引分类

    在绝大多数情况下,Mysql索引都是基于B+树的,而索引可以提高数据查询的效率.但是Mysql是如何利用B+树进行查询的呢?索引的作用只是提高查询效率吗? Mysql中的B+Tree索引 假设有一张教 ...

  5. mysql索引linke和等于_10分钟让你明白MySQL是如何利用索引的

    1.前言 在MySQL中进行SQL优化的时候,常常会在一些状况下,对MySQL可否利用索引有一些迷惑.数据库 譬如:ide MySQL 在遇到范围查询条件的时候就中止匹配了,那么究竟是哪些范围条件? ...

  6. mysql是如何管理数据结构_MySQL索引背后的数据结构和原理

    这是我看到的一篇博客,讲得非常详细,分享给大家:http://blog.codinglabs.org/articles/theory-of-mysql-index.html Abstract: 本文以 ...

  7. mysql索引4种结构_mysql索引:四种类型,两种方法

    1. 普通索引:最基本的索引,它没有任何限制,用于加速查询. 2. 唯一索引unique:索引列的值必须唯一,但允许有空值.如果是组合索引,则列值的组合必须唯一. 3. 主键索引: 是一种特殊的唯一索 ...

  8. mysql索引分析和优化_MySQL索引分析和优化

    什么是索引? 索 引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的 所有记录,直至找到符合要求的记录.表 ...

  9. mysql索引背后的数据结构_MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎 对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如B ...

最新文章

  1. Javascript日期格式化指定格式的字符串实现
  2. 初等数论--同余--MILLER-RABIN素性检测算法
  3. Android学习—补间动画(渐变动画)
  4. C语言 · 未名湖边的烦恼
  5. layui根据name获取对象_layui表格行合并;解决侧边固定栏合并
  6. 头条账号权重被降低后会导致点赞推荐兑换率会下降
  7. 关于Element UI中页面样式小问题
  8. 360云盘直链解析PHP,360云盘分析直链解析
  9. 数据结构笔记(二十)--二叉树的存储
  10. 小白0代码基础学习RF接口测试心灵路程
  11. 服装收银系统2022年排行榜新鲜出炉!
  12. 华为USG6000 防火墙默认设置
  13. python解析mht文件_[原创].mht文件图片解析工具
  14. 面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题
  15. SSL单向、双向认证
  16. selenium进行QQ空间登录
  17. 高颜值 Markdown 编辑器(GitHub 标星 17.5 K)
  18. 一直以来电脑只是在不断模拟人类的潜意识部分 - 思维部分就是电脑实现人工智能的目标
  19. 领域驱动设计和开发实战
  20. linux系统禁用usb设备

热门文章

  1. 艰难的时候总会过去,只要你能坚持下来~
  2. luajit官方性能优化指南和注解
  3. asp access服装商城计算机设计网站作品
  4. linux 内核udp编程,Linux下网络编程实现UDP,还有大量实例
  5. Python Imaging Library: ImageQt Module(图像QT模块)
  6. CMarkup类简介
  7. integer为null_走进 JDK 之 Integer
  8. vagrant特性——基于docker开发环境(docker和vagrant的结合)-2-命令
  9. 赋能时空云计算,阿里云数据库时空引擎Ganos上线
  10. puTTY、xshell链接Linux