巅峰战队|详解一条查询select语句和更新update语句的执行流程( 三 )
优化器并不是万能的MySQL优化器也并不是万能的 , 并不是总能把我们写的糟糕的sql语句优化成一个高效的查询语句 , 而且也有很多种原因会导致优化器做出错误的选择:
- 统计信息不准确 。 MySQL评估成本依赖于存储引擎提供的的统计信息 , 然而存储引擎提供的统计信息有时候会有较大偏差 。
- 执行计划的成本估算不等于实际的执行成本 。 比如估算成本的时候不考虑缓存 , 而实际执行有些数据在缓存中 。
- 优化器认为的最优可能并不是我们需要的最优 。 比如有时候我们想要时间最短 , 但是优化器
- 优化器从不考虑其他并发的查询 。
- 优化器并不总是基本成本的优化 。 有时候也会基于规则 , 比如当存在全文索引 , 查询时使用了match()子句时 , 即使选择其他索引更优 , 优化器仍然会选择全文索引 。
- 优化器不将不受其控制的操作计算为成本 。 如执行存储过程或者用户自定义函数的成本 。
- 优化器有时候无法估算所有的执行计划 , 所以也有可能错过最优执行计划 。
SHOW VARIABLES LIKE 'optimizer_trace';set optimizer_trace='enabled=on';
接下来执行一句查询语句:SELECT t1.name AS name1,t2.name AS name2 FROM test t1 INNER JOIN test2 t2 ON t1.id=t2.id
这时候优化器的分析过程已经被记录下来了 , 可以通过下面语句查询:SELECT * FROM information_schema.optimizer_trace;
得到如下结果:上面的图是为了看数据效果 , 如果需要自己操作的话 , 需要用shelll命令窗口去执行 , sqlyog工具中直接查询出来TRACE列是空的 , shell中返回的TRACE列信息如下:
从截图中的轮廓可以看出来这是一个json数据格式 。
跟踪信息主要分为以下三部分(上图并未将全部内容展示出来 , 感兴趣的可以自己去尝试一下 , 开启之后记得及时关闭哦):
- 准备阶段(join_preparation):expanded_query中的查询语句就是优化后的sql
- 优化阶段(join_optimization):considered_execution_plans中列出来所有的执行计划
- 执行阶段(join_execution)
- 大河客户端|布局战队,导师各有妙招,《2020中国好声音》收视率蝉联第一
- 周到|“好声音”蝉联省级卫视综艺节目收视第一,首迎抢位战导师布局战队各有妙招
- 综艺|靠师兄“上位”,出道即巅峰,她光环加身却依旧是糊咖
- 王者荣耀|王者重开机制揭秘:钻石段位以上必看,五战士,四辅助可重开,巅峰赛不能
- 杜兰特|83投60中!比巅峰杜兰特还强,季后赛最强球星出现了
- 青年|射手梯度排名更新,又一无解T0诞生,张大仙我愿称他为射手巅峰
- 通天战队|A股最励志闻泰科技!给华为小米打工到半导体巨头,半年赚17亿
- |《街舞3》火舞台battle开启 钟汉良战队团魂之力势不可挡
- |《这!就是街舞》第三季火舞台热力喷发,队长领衔齐舞大秀燃炸战队之魂
- 巅峰战队|ConcurrentHashMap的部分源码分析