在做数据库优化的过程中可以通过explain来查看查询有没有走索引,但是
mysql从5.0.37版本开始增加了对show profiles和show profile 语句的支持,通过
have_profiling参数,能够看到当前mysql是否支持profile;
mysql> select @@have_profiling;
+-------------------------------+
|@@have_profiling |
+-------------------------------+
| YES |
+-------------------------------+
1 row in set (0.00 sec)
默认profiling是关闭的,可以通过set语句在session级别开启profiling:
mysql> select @@profiling;
+-------------------------------+
| @@profiling |
+-------------------------------+
| 0 |
+------------------------------+
1 row in set (0.00 sec)
mysql> set profiling=1;
query ok ,0 rows affected(0.00 sec)
通过 profile,我们能够更清楚地了解sql执行的过程,例如,我们知道myisam表有表元数据的缓
存(例如行数,即count(*)值),那么对一个myisam表的count(*)是不需要消耗太多资源的,而对于
innodb来说,就没有这种元数据缓存,count(*) 执行地较慢,下面做个实验验证一下。
首先,在一个innodb引擎的付款表payment上,执行一个count(*)查询:
mysql> select count(*) from payment;
+------------------------------+
| count(*) |
+------------------------------+
| 16049 |
+------------------------------+
1 row in set (0.00 sec)
执行完毕后,通过show profiles语句,看到当前sql的queryID为4:
mysql>show profiles;
![b4851cfd24d6a5d65da91990a27f8ddc.png](https://i-blog.csdnimg.cn/blog_migrate/20511448744769a42b0fdda633bf53ca.jpeg)
通过 show profile for query语句能够看到执行过程中线程的每个状态和消耗的时间:
![349a5185436ae11c7e39150ca7d70c03.png](https://i-blog.csdnimg.cn/blog_migrate/ccb9e31546c8f6ffd71f0a39f6f01c51.jpeg)
show profile cpu for query 4;