1、前言

在MySQL中进行SQL优化的时候,常常会在一些状况下,对MySQL可否利用索引有一些迷惑。数据库

譬如:ide

MySQL 在遇到范围查询条件的时候就中止匹配了,那么究竟是哪些范围条件?

MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢?

MySQL 到底在怎么样的状况下可以利用索引进行排序?

今天,我将会用一个模型,把这些问题都一一解答,让你对MySQL索引的使用再也不畏惧。优化

2、知识补充

key_lenui

EXPLAIN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,一般咱们可借此判断联合索引有多少列被选择了。this

在这里 key_len 大小的计算规则是:spa

通常地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;

若是是字符串类型,还须要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes;

若该列类型定义时容许NULL,其key_len还须要再加 1 bytes;

若该列类型为变长类型,例如 VARCHAR(TEXTBLOB不容许整列建立索引,若是建立部分索引也被视为动态列类型),其key_len还须要再加 2 bytes;

3、哪些条件能用到索引

首先很是感谢登博,给了我一个很好的启发,我经过他的文章_,而后结合本身的理解,制做出了这幅图:code

乍一看,是否是很晕,不急,咱们慢慢来看server

图中一共分了三个部分:排序

Index Key :MySQL是用来肯定扫描的数据范围,实际就是能够利用到的MySQL索引部分,体如今Key Length。

Index Filter:MySQL用来肯定哪些数据是能够用索引去过滤,在启用ICP后,能够用上索引的部分。

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 =1

index 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。

4、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

5、索引的排序

在数据库中,若是没法利用索引完成排序,随着过滤数据的数据量的上升,排序的成本会愈来愈大,即便是采用了limit,可是数据库是会选择将结果集进行所有排序,再取排序后的limit 记录,并且MySQL 针对能够用索引完成排序的limit 有优化,更能减小成本。

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也是相似

6、小结

针对MySQL索引,我这边只是提到了在单表查询状况下的模型,经过这篇文章,想必你们应该了解到MySQL大部分状况下是如何利用索引的。

mysql索引linke和等于_10分钟让你明白MySQL是如何利用索引的相关推荐

  1. mysql调试索引_10 分钟让你明白 MySQL 是如何利用索引的?

    一.前言 在 MySQL 中进行 SQL 优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? ...

  2. mysql between and 包含边界吗_10分钟让你明白MySQL是如何利用索引的

    一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL ...

  3. mysql索引linke和等于_MySQL索引怎么用?秒懂只需四个点!

    一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: 1.MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? 2.My ...

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

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

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

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

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

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

  7. mysql和mariadb可以同时使用吗_10分钟实现MariaDB与MySQL在一台服务器同时运行

    [root@HE3 ~]#groupaddmariadb-g 513 [root@HE3 ~]#useradd -u 513-gmariadb-s /sbin/nologin -d /home/mar ...

  8. mysql书写规则_每天10分钟带你学会MySQL(二)SQL语句的基本书写规则

    SQL语句时必须要遵守一些规则.这些规则都非常简单,接下来就让我们逐一认识一下吧. 1,SQL语句以分号(;)结尾. ■SQL语句要以分号(;)结 尾 一条SQL语句可以描述一个数据库操作.在RDBM ...

  9. mysql 创建表_每天10分钟带你学会MySQL(三)表的创建

    要掌握的要点: 表通过CREATE TABLE语句创建而成. 表和列的命名要使用有意义的文字. 指定列的数据类型(整数型.字符型和日期型等). 可以在表中设置约束(主键约束和NOT NULL约束等). ...

最新文章

  1. Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。
  2. Maltego发布新版本4.2.18
  3. VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案
  4. android 手机投影演示 ——vysor操作手册
  5. 使用rman本机复制新数据库
  6. [转载] mac开发者,你不得不知道的环境变更设置方法(如Java的环境变更 source命令 )
  7. 浅谈tomcat的配置及数据库连接池的配置
  8. 简单说一下什么是设计模式?
  9. 使用NodeJS连接到MySQL数据库Client does not support authentication protocol requested by server; consider upg
  10. CentOS7 安装 Mysql 服务
  11. 超柔磨绒印花空调被(200*230cm) -凡客诚品工商银行团购专区- VANCL凡客诚品
  12. 金蝶k3服务器物理内存过高,金蝶k3提示超出内存解决方案
  13. 单点登录Cas如何保证客户端的安全性
  14. SpringBoot集成DM数据库
  15. lqr算法 c语言,【CS229 lecture18】linear quadratic regulation(LQR) 線性二次型調節控制
  16. 592. 分数加减运算 : 表达式计算入门题
  17. 微信小程序:简单计算器
  18. Julia学习笔记:使用GLM包进行一元回归分析及模型拟合度检验
  19. 第5章 域内横向移动分析及防御
  20. 骨感传导蓝牙耳机怎么样、骨感传导蓝牙耳机有什么特点

热门文章

  1. 【机器学习】XgBoost 原理详解 数学推导
  2. 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)
  3. 免费的python编辑器_免的解释|免的意思|汉典“免”字的基本解释
  4. python语言属于机器语言汇编语言高级语言自然语言_机器语言,汇编语言,高级语言的主要特点及区别是什么...
  5. 在自己的app中打开淘宝
  6. 2022材料员-岗位技能(材料员)操作考试题及答案
  7. 银行活期存取款业务处理系统的数据流图
  8. toi,atol,strtod,strtol,strtoul实现类型转换
  9. Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
  10. ol-ext transform 对象,旋转、拉伸、放大(等比例缩放),事件监听