MySQL5.6版本后提供了对SQL的跟踪工具trace,通过使用trace阔以让我们明白optimizer如何选择执行计划的。
使用过程:
1,打开trace,设置格式为JSON,设置trace的缓存大小,避免因为容量大小而不能显示完整的跟踪过程。
set optimier_trace="enabled=on",end_markers_in_JSON=on;
2,执行想做trace的SQL语句,例如执行sakila数据库中payment中customer_id=1的所有支付金额(amount)记录:
select amount from payment where customer_id=1;
3,查询information_schema.optimizer_trace,可以看到跟踪记录了
select *from information_schema.optimizer_trace \G
部分结果: ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆ ⬆
分析表的大体步骤如下:(加了部分注释,可供参考)
mysql> select *from information_schema.optimizer_trace \G
*************************** 1. row ***************************
QUERY: select amount from payment where customer_id=1
TRACE: {
"steps": [
{
"join_preparation": { //预备工作
"select#": 1,
"steps": [
{
"expanded_query": "/* select#1 */ select `payment`.`amount` AS `amount` from `payment` where (`payment`.`customer_id` = 1)"
}
] /* steps */
} /* join_preparation */
},
{
"join_optimization": { //进行优化
"select#": 1,
"steps": [