一、引出Profiling
显然我们在评价一条SQL语句的好坏时最直观的评价指标就是它执行时长了。那我们要如何得知一条SQL语句的执行时间呢?Mysql5.0之后的版本提供了Query Profiler 功能,它不仅可以计算出每一条Query的执行时间,并且它还可以显示这条Query的性能问题,例如执行这条SQL消耗了到少CPU、IO等资源,以便于我们针对性的对其进行性能调优。
二、Profiling如何使用
1.开启Profiling
Profiling默认是关闭状态,我们先来查看一下此功能有没有开启:
- 登录mysql
mysql -uroot -p
- 输入密码后,进到mysql里,输入如下语句查询profiling状态,可以看到默认值为OFF。
mysql> show variables like 'profiling';
+
| Variable_name | Value |
+
| profiling | OFF |
+
1 row in set, 9 warnings (0.00 sec)
- 开启profiling,关闭的话设置为0即可。
mysql> set profiling=1
2.Profiling使用
现在我们就可以来使用Profiling了。在开启profiling功能后,MySQL就会自动记录所有执行的 Query 的 profile 信息。
mysql> show profiles;
获取系统中所有Query的profile信息(默认显示最近15条,Query_ID依次递增) — 其中Query_ID是SQL语句的ID编号,Duration是这条SQL语句的执行时长,Query是具体的SQL语句。 重点来了:我们还可以通过show profile [参数1] for query [Query_ID] 来查看指定ID的SQL语句的详细资源消耗情况。 参数1为可选类型值,具体如下:
- ALL显示所有信息
- BLOCK IO显示块输入和输出操作的计数
- CONTEXT SWITCHES显示自愿和非自愿上下文切换的计数
- CPU显示用户和系统 CPU 使用时间
- IPC显示发送和接收的消息计数
- MEMORY当前未实现
- PAGE FAULTS显示主要和次要页面错误的计数
- SOURCE显示源代码中的函数名称,以及发生函数的文件的名称和行号
- SWAPS显示交换计数
show profile cpu,block io for query [Query_ID];
三、实际应用场景
在开发阶段,出现慢SQL,我们可以先通过explain 语句查看该SQL的执行情况; 例如,这里准备了一张表test_user,想要查询地区(region_id)为64的user_name:
explain select user_name from test_user WHERE region_id = 64;
看这条语句有没有走索引(key),我这显然是没有的,没有的话需要建立合适的索引; 如果已经走索引,可以通过show profile来进一步排查。
|