常用有三种方法:
## 1、show profile
在mysql 5.1 之后引入,默认是禁用的,可以通过以下命令开启:
`mysql> set profiling=1;`
执行一些查询,然后再执行如下命令:
![](https://box.kancloud.cn/7dd64f4d84651b70c98b6f094e254771_673x155.png)
显示了精度很高的查询响应时间。
继续执行:
![](https://box.kancloud.cn/a286a06d905565991c492e20b970cce4_306x332.png)
显示查询执行的每个步骤及其花费的时间,但是是根据执行步骤排序,现在需要根据时间来排序:
~~~
mysql> select state,sum(duration) as total_r,
-> round(
-> 100* sum(duration)/
-> (select sum(duration)
-> from information_schema.profiling
-> where query_id = @query_id
-> ),2) as pct_r,
-> count(*) as calls,
-> sum(duration) / count(*) as "r/call"
-> from information_schema.profiling
-> where query_id = @query_id
-> group by state
-> order by total_r desc;
~~~
![](https://box.kancloud.cn/2bfae1a9a8cc3f7448f0da5fc1b18867_542x327.png)
可以看到花费时间最多的是打开数据表,其次是发送数据
## 2、show status
首先清空一下 ` mysql> flush status;`
执行一下查询: `mysql> select * from cmf_course_drop where cid='9771510558193';`
执行:`mysql> show status where variable_name like 'handler%' or variable_name like 'created%';`
![](https://box.kancloud.cn/843a9949c67ffbf5b0d52f45c281a128_318x424.png)
* Created_tmp_disk_tables
服务器在处理语句时在磁盘上创建的磁盘临时表个数。
* Created_tmp_files
服务器创建的临时文件个数。
* Created_tmp_tables
服务器在处理语句时创建的临时表个数。
* Handler_commit
请求提交事务的次数。
* Handler_delete
请求从表删除行的次数。
* Handler_external_lock
此变量与锁定操作数量有关,主要是在表访问的开始和结束时起作用。其值除以2,即为锁定操作的次数。该变量是在MySQL 5.6.2里引入的。
* Handler_mrr_init
有些存储引擎自己实现了“多范围读取”(Multi-Range Read)优化策略。此变量表示的是服务器使用该实现的次数。该变量是在MySQL 5.6.1里引入的。
* Handler_prepare
为两阶段提交所做的准备次数。
* Handler_read_first
请求从索引里读取第一行的次数。
* Handler_read_key
请求基于索引值读取行的次数。
* Handler_read_last
请求从索引里读取最后一行的次数。比变量是在MySQL 5.5.7里引入的。
* Handler_read_next
按索引顺序请求读取下一行的次数。
* Handler_read_prev
按索引逆序请求读取上一行的次数。
* Handler_read_rnd
根据位置请求读取一行的次数。
* Handler_read_rnd_next
请求读取下一行的次数。如果这个值很大,则说明你可能在执行大量的需要全表扫描的语句,或者执行大量的未正确使用索引的语句。
* Handler_rollback
请求事务回滚的次数。
## 3、查看慢查询日志