今天面试,问及一个问题,如果在一张表上添加索引,你该如何判断该索引是否执行。诚然我不知晓,面试后才知道MYSQL里面有一个执行计划,可以解决这个问题。
一.什么叫做MYSQL执行计划
SQL执行计划,就是一条SQL语句,在数据库中实际执行的时候,一步步的分别都做了什么。就是我们用EXPLAIN分析一条SQL语句时展示出来的那些信息
二.为什么要学习MYSQL执行计划
了解SQL执行计划的意义就在于我们可以通过执行计划更加清晰的认识到这一条语句,分为了哪几步,有没有用到索引,是否有一些可优化的地方等。
首先我们来看一条sql语句的执行计划
select_type
查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询
1、SIMPLE:简单的select查询,查询中不包含子查询或者union
2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
3、SUBQUERY:在select 或 where列表中包含了子查询
4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
5、UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
6、UNION RESULT:从union表获取结果的select
执行计划的 type
访问类型,SQL 查询优化中一个很重要的指标,结果值从好到坏依次是:
system > const > eq_ref > ref > range > index > ALL。
system:系统表,少量数据,往往不需要进行磁盘IO
const:常量连接
eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描
ref:非主键非唯一索引等值扫描
range:范围扫描
index:索引树扫描
ALL:全表扫描(full table scan)
三实际测试
create table easy_user(
id int primary key auto_increment,
name varchar(30) not null
) engine=innodb default charset=utf8mb4;
根据id查询mysql执行计划
explain select * from easy_user where id=1;
在没有加索引的情况下,根据name查询
explain select * from easy_user where name=‘Jack’;
我在name上添加一个索引字段
explain select * from easy_user where name=‘Jack’;
我修改索引类方法
explain select * from easy_user where name=‘Jack’;
如果更换为唯一索引呢
explain select * from easy_user where name=‘Jack’;
更换索引方法
实践证明:这个执行计划是可以清晰的看到sql的执行是否使用了索引的
参考博文:
https://www.cnblogs.com/yinjw/p/11864477.html
https://www.jianshu.com/p/514aa0b139d8