抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何对数据库进行性能分析。

环境

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 配置

查看配置:

sql
1
show variables like 'profiling%';

手动开启,仅在当前会话有效:

sql
1
set profiling=on;

2.3 使用

默认记录最近15条使用的SQL语句,正常执行SQL语句后查看执行情况:

sql
1
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的执行情况:

sql
1
show profile [选项] for query [查询编号];

说明:

  • all:显示所有的开销信息。
  • block io:显示块IO相关开销。
  • context switches:上下文切换相关开销。
  • cpu:显示CPU相关开销信息。
  • ipc:显示发送和接收相关开销信息。
  • memory:显示内存相关开销信息。
  • page faults:显示页面错误相关开销信息。
  • source:显示和Source相关的开销信息。
  • swaps:显示交换次数相关开销的信息。

示例:

sql
1
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:发生了锁表操作。

评论