前言
在之前的面试过程中,问到执行计划,有很多童鞋不知道是什么?甚至将执行计划与执行时间认为是同一个概念。今天我们就一起来了解一下执行计划到底是什么?有什么用途?
执行计划是什么?
执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL使用 explain 关键字来查看SQL的执行计划。如下所示:
//1. 查询t_base_user
select * from t_base_user where name="andyqian";
//2. 查看上述语句的执行计划
explain select * from t_base_user where name="andyqian";
执行查看上述2语句后,我们可以得出以下执行计划结果
上面执行计划是什么意思呢?有什么参考价值呢?
上面这个执行计划给到的信息是: 这个结果通过一个简单的语句全表扫描,共扫描1行,使用where条件在t_base_user表中筛选出的。发现该语句并没有走索引,为什么是这样的呢?别急,我们紧接着看下一节。
读懂执行计划
通过上面,我们知道了什么是执行计划,也看到了执行计划到底是什么东西,现在我们来具体了解一下,MySQL执行计划中,每个属性代表的是什么意思?
我们一一来介绍,并说明每个属性有哪些可选值,以及每个可选值的意思。
-
id
表示查询中select操作表的顺序,按顺序从大到依次执行 -
select_type :
该表示选择的类型,可选值有: SIMPLE(简单的), -
type :
该属性表示访问类型,有很多种访问类型。
最常见的其中包括以下几种: ALL(全表扫描), index(索引扫描),range(范围扫描),ref (非唯一索引扫描),eq_ref(唯一索引扫描,),(const)常数引用, 访问速度依次由慢到快。其中 : range(范围)常见与 between and …, 大于 and 小于这种情况。
提示 : 慢SQL是否走索引,走了什么索引,也就可以通过该属性查看了。 -
table :
表示该语句查询的表 -
possible_keys :
顾名思义,该属性给出了,该查询语句,可能走的索引,(如某些字段上索引的名字)这里提供的只是参考,而不是实际走的索引,也就导致会有possible_Keys不为null,key为空的现象。 -
key :
显示MySQL实际使用的索引,其中就包括主键索引(PRIMARY),或者自建索引的名字。 -
key_len :
表示索引所使用的字节数, -
ref :
连接匹配条件,如果走主键索引的话,该值为: const, 全表扫描的话,为null值 -
rows :
扫描行数,也就是说,需要扫描多少行,采能获取目标行数,一般情况下会大于返回行数。通常情况下,rows越小,效率越高, 也就有大部分SQL优化,都是在减少这个值的大小。注意: 理想情况下扫描的行数与实际返回行数理论上是一致的,但这种情况及其少,如关联查询,扫描的行数就会比返回行数大大增加) -
Extra
这个属性非常重要,该属性中包括执行SQL时的真实情况信息,如上面所属,使用到的是”using where”,表示使用where筛选得到的值,常用的有:
“Using temporary”: 使用临时表 “using filesort”: 使用文件排序
看到这里,我们应该已经发现,在第一步中,我们的这条SQL
select * from t_base_user where name="andyqian";
是没有走索引的,而且还是全表扫描,在数据量少的情况下,问题还不会特别突出,如果数据量比较大,这可是个会造成生产事故的慢查询哦,现在我们改造一下,将name字段添加上索引,
# 添加索引
alter table t_base_user add index idx_name(name);
看看它的执行计划是怎样的。
你看,现在已经走idx_name索引了,其type从All(全表扫描)到ref(非唯一索引了),别看就只有这一点点小区别,在大数据量的时候,可是会起大作用的哦。
数据结
本文中演示的数据结构如下:
# 创建表
create table t_base_user(
oid bigint(20) not null primary key auto_increment,
name varchar(30) null comment "name",
email varchar(30) null comment "email",
age int null comment "age",
telephone varchar(30) null comment "telephone",
status tinyint(4) null comment "0 无效 1 有效",
created_at datetime null comment "",
updated_at datetime null comment ""
)
## 新增记录:
insert into t_base_user(name,email,age,telephone,created_at,updated_at)values("andyqian","andytohome@gmail.com",20,"15608411",now(),now());
)
最后
一个好的数据库表设计,从一开始就应该考虑添加索引,而不是到最后发现慢SQL了,影响业务了,才来补救。其实我在工作经历当中,由于新建表,或新加字段后,忘记添加索引也造成了多次生产事故,记忆犹新!!!
其实新建索引也是有一定的原则的,建什么索引,建在哪些字段上,这里面还有不少知识呢,下一篇文章写,尽请期待吧!
相关推荐
我们可以对MySQL的对象(表、索引、触发器、自建函数、存储过程等)做注释(comment),这样做的目的是标识该对象的作用等以增强代码的可读性、方便其他同事快速读懂我们写的代码或某个数据库对象的作用,说白了,...
文章目录为什么需要事务事务的概念和特性原子性 Atomicity一致性 Consistency隔离性 Isolation持久性 Durability语法和流程执行事务注意事项设置事务自动提交事务隔离级别四类隔离级别读未提交读提交可重复读串行化...
说得简单点就是大家都在一个模式下写代码,这样就能保证写出来的程序能被每一个人都能够读懂,而且有些基本的东西它可以自动帮你生成,不用你自己一个一个的敲了,达到了代码复用。这样保证可读性的同时也提高了开发...
由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能执行效果和书上不能完全一致,请读者读懂原理后灵活处理。 说明:因为mirror.rar文件引用了第三方网站的大量信息,这需要得到网站的授权,授权的办理...
由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能执行效果和书上不能完全一致,请读者读懂原理后灵活处理。 说明:因为mirror.rar文件引用了第三方网站的大量信息,这需要得到网站的授权,授权的办理...
由于光盘容量有限,笔者删除了原始镜像目录中一部分的网页,可能执行效果和书上不能完全一致,请读者读懂原理后灵活处理。 说明:因为mirror.rar文件引用了第三方网站的大量信息,这需要得到网站的授权,授权的办理...
你不一定读得懂 . 2.你所下载的只不过是一个指向(或包含)那个手机铃声的网页,你要真正得到那个铃声的地址才能下载它 . 3.应该不是php,是pdf,你把后缀改一下,php文件是网页格式,用文本编辑器打开,但是本站提供...
哈孤卯翼读沥荣溪逆瓤洱攻胀迟写贮壕累素酝疯尸讣欢微懂妮墓超市管理系统 系统概述 超市需要处理大量的库存信息,还要时刻更新产品的销售信息,不断添加商品信息。面 对不同种类的信息,需要合理的数据库结构来保存...
halt执行时,杀死应用进程,执行sync(将存于buffer中的资料强制写入硬盘中)系统调用,文件系统写操作完成后就会停止内核。若系统的运行级别为0或6,则关闭系统;否则以shutdown指令(加上-h参数)来取代。 ...
第二、改更文件属性,请将根目录下的以PHP为后轰名的文件和"/include/domain.php"和 "/attachments" 和 "/data"文件夹以及文件夹下所以的文件属性改成“可读”、“可写”、“可执行”,通常是“755”。...
翻译: 很多程序员在读完这本书,宣布自己相当于经历了一次"主显节"(纪念那稣降生和受洗的双重节日),如果你从来没有读 过这本书,你会在你的程序教育生涯里存在一个严重裂沟,所以你应该立即挽救弥补! 可以这么说:GoF ...