摘要:本文学习了如何对数据库进行性能分析。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
1 慢查询
1.1 配置
修改MySQL配置文件,开启并配置慢查询日志,重启MySQL服务器。
1.2 查看
使用mysqldumpslow工具查看记录的慢查询SQL。
1.3 分析
使用explain语句分析慢查询SQL的执行情况,根据结果进行相应的优化。
2 profile
2.1 说明
使用profile命令可以分析当前会话中语句执行的资源消耗情况,常与explain命令配合使用。
注意,在5.7之后的版本中不建议使用profile命令,建议使用performance pchema
工具。
2.2 配置
查看配置:
sql1
| show variables like 'profiling%';
|
手动开启,仅在当前会话有效:
sql
2.3 使用
默认记录最近15条使用的SQL语句,正常执行SQL语句后查看执行情况:
sql1 2 3 4 5 6 7 8 9 10
| mysql> show profiles; + | Query_ID | Duration | Query | + | 1 | 0.00026175 | select * from bill | | 2 | 0.00083425 | select * from user | + 2 rows in set (0.07 sec)
mysql>
|
根据查询编号查看指定SQL的执行情况:
sql1
| show profile [选项] for query [查询编号];
|
说明:
- all:显示所有的开销信息。
- block io:显示块IO相关开销。
- context switches:上下文切换相关开销。
- cpu:显示CPU相关开销信息。
- ipc:显示发送和接收相关开销信息。
- memory:显示内存相关开销信息。
- page faults:显示页面错误相关开销信息。
- source:显示和Source相关的开销信息。
- swaps:显示交换次数相关开销的信息。
示例:
sql1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| mysql> show profile cpu, block io for query 1; + | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | + | starting | 0.000050 | 0.000000 | 0.000000 | NULL | NULL | | checking permissions | 0.000011 | 0.000000 | 0.000000 | NULL | NULL | | Opening tables | 0.000018 | 0.000000 | 0.000000 | NULL | NULL | | init | 0.000015 | 0.000000 | 0.000000 | NULL | NULL | | System lock | 0.000005 | 0.000000 | 0.000000 | NULL | NULL | | optimizing | 0.000002 | 0.000000 | 0.000000 | NULL | NULL | | statistics | 0.000009 | 0.000000 | 0.000000 | NULL | NULL | | preparing | 0.000008 | 0.000000 | 0.000000 | NULL | NULL | | executing | 0.000001 | 0.000000 | 0.000000 | NULL | NULL | | Sending data | 0.000055 | 0.000000 | 0.000000 | NULL | NULL | | end | 0.000002 | 0.000000 | 0.000000 | NULL | NULL | | query end | 0.000006 | 0.000000 | 0.000000 | NULL | NULL | | closing tables | 0.000004 | 0.000000 | 0.000000 | NULL | NULL | | freeing items | 0.000071 | 0.000000 | 0.000000 | NULL | NULL | | cleaning up | 0.000007 | 0.000000 | 0.000000 | NULL | NULL | + 15 rows in set (0.07 sec)
mysql>
|
需要注意的Status字段取值:
- converting HEAP to MyISAM:查询结果太大,内存都不够用,存放到了磁盘上。
- Creating tmp table:创建临时表,后面还要删除临时表。
- Copying to tmp table on disk:把内存中临时表复制到磁盘上。
- locked:发生了锁表操作。
条