赞
踩
Optimizer Trace
在MySQL 5.6以及之后的版本中,MySQL提出了一个optimizer trace的功能,这个功能可
以让我们方便的查看优化器生成执行计划的整个过程
比如对于下面这个SQL语句:
SELECT * FROM order_exp WHERE order_no IN ('DD00_6S', 'DD00_9S',
'DD00_10S') AND expire_time> '2021-03-22 18:28:28' AND expire_time<=
'2021-03-22 18:35:09' AND insert_time> expire_time AND order_note LIKE '%7
排1%' AND order_status = 0;
我们执行如下的命令:
SET optimizer_trace="enabled=on";
SELECT * FROM order_exp WHERE order_no IN ('DD00_6S', 'DD00_9S',
'DD00_10S') AND expire_time> '2021-03-22 18:28:28' AND expire_time<=
'2021-03-22 18:35:09' AND insert_time> expire_time AND order_note LIKE '%7
排1%' AND order_status = 0;
SELECT * FROM information_schema.OPTIMIZER_TRACE;
可以看见全表扫描的成本:2169.9
使用索引idx_order_no的成本为72.61:
使用索引idx_expire_time的成本为47.81:
最终MySQL使用了idx_expire_time作为这个SQL查询过程中索引:
**优化器最终会选择成本最低的方案来作为最终的执行计划。**
在MySQL中一条查询语句的执行成本是由下边这两个方面组成的:
我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。
读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。
对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位,MySQL规定读取一个页面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2。1.0、0.2这些数字称之为成本常数,这两个成本常数我们最常用到,当然还有其他的成本常数。
注意,不管读取记录时需不需要检测是否满足搜索条件,其成本都算是0.2。
在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案,这个成本最低的方案就是所谓的执行计划,之后才会调用存储引擎提供的接口真正的执行查询,这个过程总结一下就是这样:
1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种执行方案的代价,找出成本最低的那一个
我们依然以上面的查询语句来分析:
SELECT * FROM order_exp WHERE order_no IN ('DD00_6S', 'DD00_9S',
'DD00_10S') AND expire_time> '2021-03-22 18:28:28' AND expire_time<=
'2021-03-22 18:35:09' AND insert_time> expire_time AND order_note LIKE '%7
排1%' AND order_status = 0;
idx_order_no,idx_expire_time。
MySQL为每个表维护了一系列的统计信息
MySQL给我们提供了SHOW TABLE STATUS语句来查看表的统计信息,如果要看指定的某个表的统计信息,在该语句后加对应的LIKE语句就好了,比方说我们要查看order_exp这个表的统计信息可以这么写:
SHOW TABLE STATUS LIKE ‘order_exp’\G
出现了很多统计选项,但我们目前只需要两个:
现在可以看一下全表扫描成本的计算过程:
97 x 1.0 + 1.1 = 98.1
97指的是聚簇索引占用的页面数,1.0指的是加载一个页面的IO成本常数,后边的1.1是一个微调值。
TIPS:MySQL在真实计算成本时会进行一些微调,这些微调的值是直接硬编码到代码里的,没有注释而且这些微调的值十分的小,并不影响我们大方向的分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。