mysql查看耗费时间
开启性能分析
show profiles 这个命令非常强大,能清晰的展示每条SQL的持续时间。通常结合show profile
命令可以更加详细的展示其耗时信息。这样就能很容易的分析出,到底慢在哪个环节了。比较遗憾的是,在MySQL中,该命令默认是关闭状态的。在使用之前,我们首先得启用它:
- 开启命令:
set profiling = ON;
或:
set profiling = 1; - 查看是否生效:
mysql> show variables like "profiling";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling | ON |
+---------------+-------+
1 row in set (0.00 sec)
Value的取值范围有两个:其中 ON 为开启状态,OFF为关闭状态。
值得注意的是:通过上述命令开启后仅在当前会话有效。
show profiles
show profiles 其作用为显示当前会话服务器最新收到的15条SQL的性能信息。
其中包括:持续时间,以及Query_ID。我们可以通过Query_ID分析其性能
如下所示:
mysql> show profiles; +----------+------------+---------------------------------+ | Query_ID | Duration | Query | +----------+------------+---------------------------------+ | 1 | 0.00385450 | show variables like "profiling" | | 2 | 0.00170050 | show variables like "profiling" | | 3 | 0.00038025 | select * from t_base_user | +----------+------------+---------------------------------+
其中:
- Query_ID 表示执行SQL的唯一标识。
- Duration 表示持续时间,默认单位为秒。
- Query 就是我们所执行的SQL语句。
注意:
- show profiles 语句 默认显示的是服务端接收到的最新的15条语句。
我们可以通过以下语句进行修改默认值:
set profiling_history_size =20;
profiling_history_size最大取值取值范围为[0,100]。 - 当超过100时,则会设置自动设置为最大值100。
- 当小于0时,则会自动设置最小值为0。
- 当其等于0时,其效果等同于
set profiling=0
,关闭性能分析模式。
现在通过 show profiles 命令查看到了SQL的执行时间,但这是一个总时间,每一步的耗时怎么看呢?别急,我们再来看看show profile 命令的用法。
show profile
还记得show profiles命令中的 Query_ID字段吗?我们现在就通过Query_ID来查看下持续时间的构成。
例如:我们查看Query_ID 等于 3 的详细持续时间构成。
如下所示:
mysql> show profile for query 3; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | 0.000081 | | checking permissions | 0.000012 | | Opening tables | 0.000028 | | init | 0.000029 | | System lock | 0.000017 | | optimizing | 0.000006 | | statistics | 0.000025 | | preparing | 0.000018 | | executing | 0.000004 | | Sending data | 0.000087 | | end | 0.000007 | | query end | 0.000012 | | closing tables | 0.000013 | | freeing items | 0.000023 | | cleaning up | 0.000021 | +----------------------+----------+ 15 rows in set, 1 warning (0.00 sec)
通过上述结果,我们可以非常清楚的查看每一步的耗时,其中(Druation的单位为秒)。这样,当我们遇到一条慢SQL时,就能很清楚的知道,为什么慢,慢在哪一步了。
备注: 上述结果集中的Status就不再详细解析了,这里其实展示的是SQL的执行过程,经历的步骤,通过字面就能很快知道其意思。
上面我们使用的是默认展示结果。其实,我们也指定展示结果,如:CPU,IO,线程上下文切换等等。
可选参数如下:
- all: 展示所有信息。
- block io: 展示io的输入输出信息。
- context switches: 展示线程的上线文切换信息。
- cpu :显示SQL 占用的CPU信息。
- ipc: 显示统计消息的发送与接收计数信息。
- page faults:显示主要与次要的页面错误。
- memory:本意是显示内存信息,但目前还未实现。
- swaps: 显示交换次数。
- sources:显示源代码中的函数名称,以及函数发生的文件的名称和行。
上面参数可以组合使用,其中用 , 号分割。如下所示:
mysql> show profile block io,cpu for query 3; +----------------------+----------+----------+------------+--------------+---------------+ | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | +----------------------+----------+----------+------------+--------------+---------------+ | starting | 0.000081 | 0.000036 | 0.000044 | 0 | 0 | | checking permissions | 0.000012 | 0.000005 | 0.000006 | 0 | 0 | | Opening tables | 0.000028 | 0.000013 | 0.000015 | 0 | 0 | | init | 0.000029 | 0.000013 | 0.000016 | 0 | 0 | | System lock | 0.000017 | 0.000008 | 0.000009 | 0 | 0 | | optimizing | 0.000006 | 0.000002 | 0.000003 | 0 | 0 | | statistics | 0.000025 | 0.000011 | 0.000013 | 0 | 0 | | preparing | 0.000018 | 0.000008 | 0.000010 | 0 | 0 | | executing | 0.000004 | 0.000002 | 0.000002 | 0 | 0 | | Sending data | 0.000087 | 0.000040 | 0.000048 | 0 | 0 | | end | 0.000007 | 0.000003 | 0.000003 | 0 | 0 | | query end | 0.000012 | 0.000006 | 0.000007 | 0 | 0 | | closing tables | 0.000013 | 0.000005 | 0.000006 | 0 | 0 | | freeing items | 0.000023 | 0.000011 | 0.000013 | 0 | 0 | | cleaning up | 0.000021 | 0.000009 | 0.000011 | 0 | 0 | +----------------------+----------+----------+------------+--------------+---------------+ 15 rows in set, 1 warning (0.00 sec)
当结果显示的比较多时,你也可以通过 limit 选项,来显示指定的行数。如下所示:
mysql> show profile block io,cpu for query 3 limit 2; +----------------------+----------+----------+------------+--------------+---------------+ | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | +----------------------+----------+----------+------------+--------------+---------------+ | starting | 0.000081 | 0.000036 | 0.000044 | 0 | 0 | | checking permissions | 0.000012 | 0.000005 | 0.000006 | 0 | 0 | +----------------------+----------+----------+------------+--------------+---------------+ 2 rows in set, 1 warning (0.00 sec)
现在我们就可以很清楚的知道,慢SQL到底慢在哪?可以进行针对性的优化。我们对优化后的SQL语句也能查看其持续时间,是否符合我们的指标。
PS: 最近在面试过程中,问及SQL优化时,有很多的同学对执行计划,区分度的概念都不是很清楚。甚至觉得执行计划中有执行时间,这就很离谱了,对不对。我希望我的读者朋友们不要被这种低级错误挡住理想的offer。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库