在我们调优MySQL的SQL时候,通常使用explain进行查看sql的执行计划。至于优化器为什么会这样选择,就无从得知。如果你想了解为什么,那么可以通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划.帮助我们更好的理解优化器的行为.
打开trace,并设置格式为Json
SET OPTIMIZER_TRACE=“enabled=on”,END_MARKERS_IN_JSON=on;
设置trace使用的内存大小,避免解析过程内存不足,文件显示不完整.
SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;
执行你的sql语句
select * from a, b where a.id=b.sid;
查看trace信息
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
TRACE json文件
{
"steps": [
{
"join_preparation": { ---优化准备工作
"select#": 1,
"steps": [
{
"expanded_query": "/* select#1 */ select `a`.`id` AS `id`,`a`.`name` AS `name`,`a`.`age` AS `age`,`b`.`id` AS `id`,`b`.`sid` AS `sid`,`b`.`name` AS `name`,`b`.`score` AS `score` from `a` join `b` where (`a`.`id` = `b`.`sid`)"
}
] /* steps */
} /* join_preparation */
},
{
"join_optimization": {---优化工作的主要阶段,包括逻辑优化和物理优化两个阶段
"select#": 1,
"steps": [---优化工作的主要阶段, 逻辑优化阶段
{
"condition_processing": { ---逻辑优化,条件化简
"condition": "WHERE",
"original_condition": "(`a`.`id` = `b`.`sid`)",
"steps": [
{
"transformation": "equality_propagation", ---逻辑优化,条件化简,等式处理
"resulting_condition": "(`a`.`id` = `b`.`sid`)"
},
{
"transformation": "constant_propagation", ---逻辑优化,条件化简,常量处理
"resulting_condition": "(`a`.`id` = `b`.`sid`)"
},
{
"transformation"