Explain详解
1.1 Explain的作用
在实际工作中,我们往往需要分析一条查询语句为什么执行的如此之慢,这时候Explain工具就会派上用场。Explain工具可以用来获取一条查询语句的执行计划相关信息,对输出的信息进行分析,我们大概可以知道查询是如何执行的,在此基础上,我们就可以找到速度慢的原因了。
这里提到了一个专业术语——“一条查询语句的执行计划”,我觉得还是很有必要对执行计划进行解释。一条查询语句可能有多种执行路径得到最后相同的结果,但执行不同的路径需要的成本不同,Mysql的查询优化器会为这条查询找到最好的执行路径,这就是执行计划。如执行 select * from user where id = 1,可以通过全表扫描,并根据id进行过滤得到符合条件的数据,如果在id字段上建立了索引,也可以通过索引得到数据。这就有了两种不同的执行路径,很明显第二条执行路径更优,因此Mysql查询优化器为这条SQL查询语句生成的执行计划就是采用第二条路径执行。
一条SQL查询语句可以产生多个执行计划,那Mysql是如何选择最好的执行计划呢?Mysql有一个部件,查询优化器,就是干这件事情的。Mysql使用基于成本的查询优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本做小的一个。成本最初定义为随机读取一个4K数据页的成本,后面成本的计算变得越来越复杂,其中引入了一些因子来估算某些操作的代价。我们可以使用 show status like 'last_query_cost' 语句来查找最后一次查询语句的执行计划成本。
下图是Mysql查询执行的整体路径图,Explain重点关注的对象就是图中的查询执行计划。通过Explain工具我们得到执行计划相关的信息,如查询是否利用了索引,利用了那个索引,利用这些信息,我们可以对SQL语句的性能问题进行分析并加以优化。
1.2 Explain输出详解
要使用Explain工具也很简单,这需要把 Explain 关键字放在查询语句的前面就可以了。为了进行演示,我们创建人员信息表 user_info 和订单表 order_info。CREATE TABLE `user_info` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '',
`age` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_index` (`name`)
)ENGINE = InnoDB,DEFAULT CHARSET = utf8;
INSERT INTO user_info (name, age) VALUES ('xys', 20);
INSERT INTO user_info (name, age) VALUES ('a', 21);
INSERT INTO user_info (name, age) VALUES ('b', 23);
INSERT INTO user_info (name, age) VALUES ('c', 50);
INSERT INTO user_info (name, age) VALUES ('d', 15);
INSERT INTO user_info (name, age) VALUES ('e', 20);
INSERT INTO user_info (name, age) VALUES ('f', 21);
INSERT INTO user_info (name, age) VALUES ('g', 23);
INSERT INTO user_info (name, age) VALUES ('h', 50);
INSERT INTO user_info (name, age) 假设我们有这样一个需求:输出买过产品名字为p1的所有用户的姓名。如下SQL语句即可完成,我们来看看这条查询语句explain的输出。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java开发之数据库索引篇,适合所有求职开发岗的同学~ 本专刊购买后即可解锁所有章节,故不可以退换哦~