MySQL 是如何利用索引的
一、前言
在 MySQL 中进行 SQL 优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑。例如:
MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件?
MySQL 在 LIKE 进行模糊匹配的时候又是如何利用索引的呢?
MySQL 到底在怎么样的情况下能够利用索引进行排序?
今天,我将会用一个模型,把这些问题都一一解答,让你对 MySQL 索引的使用机制有进一步的了解。
二、知识补充
key_len
EXPLAIN 执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。
在这里 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 Key 是用来确定 MySQL 的扫描范围,分为上边界和下边界。
MySQL 利用=、>=、> 来确定下边界(first key),利用最左原则,首先判断第一个索引键值在 where 条件中是否存在,如果存在,则判断比较符号,如果为 (=,>=) 中的一种,加入下边界的界定,然后继续判断下一个索引键,如果存在且是 (>),则将该键值加入到下边界的界定,停止匹配下一个索引键;
如果不存在,直接停止下边界匹配。
举个
MySQL 是如何利用索引的的更多相关文章
- 10分钟让你明白MySQL是如何利用索引的
一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL ...
- MySQL是如何利用索引的
http://fordba.com/spend-10-min-to-understand-how-mysql-use-index.html
- MySQL如何利用索引优化ORDER BY排序语句
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...
- MySQL如何利用索引优化ORDER BY排序语句 【转载】
本文转载自:http://blog.csdn.net/ryb7899/article/details/5580624 .感谢相关作者. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执 ...
- MySQL如何利用索引优化ORDER BY排序语
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...
- MySQL高级第二章——索引优化分析
一.SQL性能下降原因 1.等待时间长?执行时间长? 可能原因: 查询语句写的不行 索引失效(单值索引.复合索引) CREATE INDEX index_user_name ON user(name) ...
- MySQL 高级—— Join 、索引 、优化
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Join 查询 1.SQL执行顺序(一般情况下) 1.1 手写顺序: SELECT DISTINCT ...
- MySQL使用索引的场景及真正利用索引的SQL类型
1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...
- Mysql 排序优化与索引使用(转)
为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索引是一个不错的方法.因为索引本身也是有序的,如果在需要排序的字段上面建立了合适的索引,那么就可以跳过排序的过程,提高SQL的查询速度.下面 ...
随机推荐
- python 中 try,except,finally 的执行顺序
写代码的时候发现了好玩的事情,常常作为终止的 return 语句并不总是能够立刻跳出函数 def A(): try: for i in range(10): if i == 5: return pri ...
- RabbitMQ的简单模式快速入门与超时异常的处理方法
本文适合JAVA新人,想了解RabbitMQ又不想去看官网文档的人(英语水看的头疼(◎﹏◎),但建议有能力还是去看官网文档). 消息队列MQ(一) MQ全称为Message Queue,消息队列是应用 ...
- IDEA控制台中文乱码问题
Tomcat启动时乱码 在tomcat启动时,控制台中的中文为乱码 在idea安装路径的bin文件夹下,找到idea64.exe.vmoptions这个配置文件,添加如下代码 -Dfile.encod ...
- angularJS中select元素的应用浅析
select array 数据: select ng-model 用法: 1.可以是一个对象形式,ng-model="test" $scope.test = {name: &quo ...
- 详解js中的this指向
this指向问题是个老生常谈的问题了,现在我给大家一个例子 var obj={ bar:'Cynthia' , foo:function(){ console.log(this.bar,"w ...
- SparkStreaming之checkpoint检查点
一.简介 流应用程序必须保证7*24全天候运行,因此必须能够适应与程序逻辑无关的故障[例如:系统故障.JVM崩溃等].为了实现这一点,SparkStreaming需要将足够的信息保存到容错存储系统中, ...
- springboot 打包太大,打包瘦身,打包thin
pom文件修改: <build> <resources> <resource> <directory>src/main/resources</di ...
- linux磁盘空间满了 但是没有大文件
很常见的一个问题 linux磁盘空间满了 但是没有大文件 解决思路: 1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现各目录占用的空间都很少,有约3G的空间莫 ...
- splunk dga
https://splunkbase.splunk.com/app/3559/ 详细参考: https://www.slideshare.net/Splunk/using-machine-learni ...
- php抽象工厂模式(Abstract factory pattern)
练代码 <?php interface Button { public function render(); } interface GUIFactory { public function c ...