mysql 慢查询
1. 慢查询 1 1.1. 什么是慢查询 1 1.2. 慢查询配置 1 1.2.1. 慢查询基本配置 1 1.2.2. 慢查询解读 2 1.3. 慢查询分析 3 1.3.1. Mysqldumpslow 3 1.3.2. pt_query_digest 4 ### MySQL慢查询详解 #### 一、什么是慢查询 慢查询是MySQL中一种重要的性能调试手段,主要用于记录那些执行时间过长的SQL语句。慢查询日志可以帮助我们找到那些性能不佳的SQL语句,从而对其进行优化。默认情况下,慢查询日志功能是关闭的,需要手动配置启用。 #### 二、慢查询配置 慢查询配置主要包括以下几个关键参数: 1. **slow_query_log**:控制慢查询日志功能是否开启。 - **设置方法**:`set global slow_query_log = ON;` - **状态**:`ON`表示开启,`OFF`表示关闭。 2. **slow_query_log_file**:指定慢查询日志文件的存储路径和文件名。 - **设置方法**:`set global slow_query_log_file = '/path/to/mysql_slow.log';` 3. **long_query_time**:定义一个阈值,超过这个时间的SQL语句将会被记录到慢查询日志中。 - **默认值**:10秒 - **设置方法**:`set global long_query_time = 5;` (例如,设置为5秒) 4. **log_queries_not_using_indexes**:是否记录未使用索引的SQL语句。 - **默认值**:`OFF` - **设置方法**:`set global log_queries_not_using_indexes = ON;` 5. **log_output**:定义慢查询日志的输出方式。 - **可选值**:`FILE`, `TABLE`, `FILE,TABLE` - **默认值**:`FILE` #### 三、慢查询日志的基本配置示例 - **查看当前慢查询日志配置**: ```sql show variables like '%slow_query_log%'; show variables like '%slow_query_log_file%'; show variables like '%long_query_time%'; show variables like '%log_queries_not_using_indexes%'; show variables like 'log_output'; ``` - **设置慢查询日志**: ```sql set global long_query_time = 0; -- 设置阈值为0秒,用于演示 set global slow_query_log = ON; -- 开启慢查询日志 set global log_output = 'FILE,TABLE'; -- 输出到文件和表 ``` #### 四、慢查询日志格式解读 慢查询日志通常包含以下信息: 1. **用户名**:执行SQL的用户名称。 2. **客户端IP地址**:发起查询的客户端IP地址。 3. **线程ID**:处理SQL语句的线程标识。 4. **执行时间**:SQL语句执行的总时间(毫秒)。 5. **获取锁的时间**:获取数据库锁所需的时间。 6. **返回行数**:查询返回的结果行数。 7. **扫描行数**:查询过程中扫描的数据行数。 8. **执行的具体时间**:SQL语句实际开始执行的时间。 9. **SQL语句**:执行的具体SQL语句。 #### 五、慢查询分析工具 ##### 1. Mysqldumpslow **mysqldumpslow** 是一个常用的慢查询日志分析工具,它可以对慢查询日志中的SQL语句进行汇总并按照指定的顺序输出。支持的排序选项有: - **c**:SQL语句出现的总次数。 - **t**:SQL语句执行的总时间。 - **l**:SQL语句获取锁的总时间。 - **r**:SQL语句读取的总行数。 - **at**、**al**、**ar**:平均执行时间、平均锁等待时间、平均读取行数。 **语法示例**: ```bash mysqldumpslow -s c -t 10 /path/to/mysql_slow.log ``` 此命令表示按照出现次数(`c`)降序输出前10条(`-t 10`)慢查询。 ##### 2. pt_query_digest **pt_query_digest** 是一个更为高级的慢查询日志分析工具,相较于**mysqldumpslow**,它提供了更详尽的分析结果,支持更多的统计指标。 **语法示例**: ```bash perl ./pt-query-digest --explain h=localhost u=root p=password /path/to/mysql_slow.log ``` **主要参数解释**: - **--explain**:执行EXPLAIN分析,提供执行计划。 - **h**:MySQL服务器地址。 - **u**:MySQL登录用户名。 - **p**:MySQL登录密码。 **输出结果解析**: - **Response**:SQL语句的总响应时间。 - **time**:该查询在总响应时间中的占比。 - **calls**:该查询被调用的次数。 - **R/Call**:每次调用的平均响应时间。 - **Item**:查询对象。 #### 六、扩展阅读 - **pt-query-digest语法及重要选项**: - **--create-review-table**:当使用`--review`参数将分析结果输出到表中时,如果不存在相应的表,则自动创建。 - **--create-history-table**:当使用`--history`参数将分析结果输出到表中时,如果不存在相应的表,则自动创建。 - **--filter**:根据指定的字符串对输入的慢查询进行匹配过滤。 - **--limit**:限制输出结果的数量或比例,默认为20条,可以通过设置百分比来限制输出结果。 通过上述配置和工具的应用,我们可以有效地监控MySQL的运行状况,及时发现并解决性能瓶颈问题,提高数据库系统的整体性能。