tip: 因为平时大家用的最多的就是 explain ,所以这里我就把 explain 放在最后来分享,使得大家能够留意到除了 explain 以外的其他好工具。
检查 SQL 的资源消耗情况
mysql 中 profile 的相关配置一共有三个
mysql> show variables like '%profiling%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| have_profiling         | YES   | 
| profiling              | OFF   | 
| profiling_history_size | 15    | 
+------------------------+-------+
3 rows in set (0.00 sec)
其中 having_profiling 这个配置在 mysql 5.1.x 的版本中是没有的,在 5.5.x + 以后增加,每个选项的相关含义如下:
| 配置 | 说明 | 
| having_profiling | 当前版本的 mysql 是否支持 profile. 如果支持,则为 YES; 反之则为 NO. 这个值为只读,不能通过 set 命令进行赋值. | 
| profiling | 当前会话中 profile 是否打开. 如果已经打开, 则为 ON, 反之, 则为 OFF. 该值默认为 ON. 可以通过 set profiling = 1 或者 set profiling = ON 打开 profile, set profiling = 0 或者 set profiling = OFF 关闭 profile. | 
| profiling_history_size | 记录 profile 的条数, 默认是15条. 最大值是100(即时设置的值 > 100 ,也会默认记录为 100). 如果该值设为0, 则 profile 不会记录任何查询,相当于 profiling 设置为 OFF. profile 采取的是“出栈入栈”的形式,即在记录的查询数达到 profiling_history_size 时,则把最老的记录踢出 profile 栈,最新的记录入栈. | 
这里介绍一个小技巧, mysql 命令行中可以通过 select @@变量名 直接获取变量的值, 例如:
mysql> select @@profiling;   
+-------------+
| @@profiling |
+-------------+
|           1 | 
+-------------+
1 row in set, 1 warning (0.00 sec)
| 纬度 | 项目 | 
| BLOCK IO | IO 资源消耗 | 
| CONTEXT SWITCHES | 上下文切换资源消耗 | 
| CPU | CPU 资源消耗 | 
| IPC | 数据收发资源消耗 | 
| MEMORY | 内存资源消耗 | 
| PAGE FAULTS | [页面错误情况](http://blog.csdn.net/wujiandao/article/details/7632547) | 
| SOURCE | |
| SWAPS | 交换次数 | 
| 阶段 | 消耗 | 
参考
https://dev.mysql.com/doc/refman/5.1/en/show-profile.html
2、mysql explain