MySql-查找慢sql

1,查看mysql是否开启mansql记录日志

  show variables like 'slow_query_log';

2,慢sql记录时间

  show variables like 'long_query_time';

3,设置记录mysql为打开状态

  set global slow_query_log = 'ON';

  OFF为关闭

4,设置超过一秒的sql都将记录

  set global long_query_time = 1

5,设置记录文件

  set global slow_query_log_file='/var/lib/mysql/test_1116.log';

6,查看记录文件

  show variables like 'slow_query_log_file';

<think>我们正在讨论MySQL中如何定位SQL语句。根据引用内容,我们可以总结出以下几种方法: 1. 开启查询日志(引用[2]和[3]提到):这是最常用的方法,通过配置MySQL记录执行时间超过指定阈值的SQL语句。 2. 使用性能分析工具(如EXPLAIN)分析查询日志中记录的SQL(引用[5]详细介绍了EXPLAIN的使用)。 3. 实时监控:通过查询性能视图(如引用[4]提到的查询日志分析报表)来定位SQL。 下面我将详细说明这些步骤。</think>### MySQL 定位 SQL 语句的完整指南 在 MySQL 中定位 SQL 是性能优化的关键步骤,以下是结合引用内容的系统化方法: #### 方法 1:开启查询日志(最核心方法) ```sql -- 开启查询日志(需管理员权限) SET GLOBAL slow_query_log = 'ON'; -- 设置查询阈值(单位:秒),默认10秒,建议设为1-2秒 SET GLOBAL long_query_time = 1; -- 记录未使用索引的查询(可选但推荐) SET GLOBAL log_queries_not_using_indexes = 'ON'; -- 查看日志文件位置 SHOW VARIABLES LIKE 'slow_query_log_file'; ``` **操作流程**: 1. 执行以上命令开启日志 2. 等待业务运行(至少1小时) 3. 查看日志文件(如 `/var/lib/mysql/hostname-slow.log`) 4. 使用工具分析日志(如 `mysqldumpslow` 或 Percona Toolkit) **日志分析示例命令**: ```bash # 统计最耗时的10个查询 mysqldumpslow -s t -t 10 /path/to/slow.log # 分析锁等待时间最长的查询 mysqldumpslow -s l -t 5 /path/to/slow.log ``` > 通过查询日志可捕获95%以上的性能问题[^2][^3] #### 方法 2:实时性能监控 ```sql -- 查看当前运行的查询(需PROCESS权限) SHOW FULL PROCESSLIST; -- 筛选执行时间超过5秒的查询 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 5 AND COMMAND = 'Query'; ``` **关键列解读**: - `Time`:已执行时间(秒) - `State`:当前状态(如 `Sending data`、`Sorting result`) - `Info`:完整SQL语句 > 适合实时诊断突发性能问题[^1] #### 方法 3:性能分析工具 **1. EXPLAIN 执行计划分析**: ```sql EXPLAIN SELECT * FROM orders WHERE user_id = 100; ``` **核心关注点**(引用[5]): | 字段 | 说明 | 优化方向 | |---------------|----------------------------------------------------------------------|------------------------------| | type | 访问类型(ALL全表扫描、index索引扫描、range范围扫描) | 避免ALL,争取range或ref | | rows | 预估扫描行数 | >1000行需警惕 | | Extra | 附加信息(Using filesort文件排序、Using temporary临时表) | 需重点优化 | | possible_keys | 可能使用的索引 | 验证是否缺失索引 | **2. Performance Schema(MySQL 5.6+)**: ```sql -- 开启事件监控 UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE '%statement/%'; -- 查询最耗CPU的SQL SELECT sql_text, SUM(timer_wait)/1000000000 AS exec_sec FROM performance_schema.events_statements_history GROUP BY sql_text ORDER BY exec_sec DESC LIMIT 10; ``` #### 方法 4:专业工具链 1. **Percona Toolkit**: ```bash # 分析日志生成报告 pt-query-digest /var/lib/mysql/slow.log > slow_report.txt ``` 报告包含(引用[4]): - 总查询次数和去重SQL- 平均执行时间/锁等待时间 - 结果行 vs 扫描行比例 - 95%请求的响应时间分布 2. **MySQL Enterprise Monitor**: - 可视化查询分析 - 自动索引建议 - 实时性能仪表盘 #### 优化实践案例 **问题场景**(引用[1][3]): ```sql SELECT * FROM users WHERE name LIKE '%john%'; ``` **定位过程**: 1. 日志显示该查询执行2.8秒 2. `EXPLAIN` 显示 `type=ALL`(全表扫描) 3. `rows=500,000`(扫描所有行) **优化方案**: ```sql -- 添加全文索引 ALTER TABLE users ADD FULLTEXT(name); -- 改写查询(引用[3]) SELECT * FROM users WHERE MATCH(name) AGAINST('john*' IN BOOLEAN MODE); ``` > 优化后执行时间降至50ms,提升56倍[^3] #### 最佳实践建议 1. **定期日志分析**:每天自动分析日志并邮件报警 2. **阈值设置**:生产环境设置 `long_query_time=0.5` 3. **索引监控**:每周检查冗余/缺失索引 ```sql -- 查找冗余索引 SELECT * FROM sys.schema_redundant_indexes; -- 查找缺失索引 SELECT * FROM sys.schema_index_statistics; ``` 4. **版本升级**:MySQL 8.0 的直方图统计提升优化器准确性 通过组合使用这些方法,可系统化定位MySQLSQL问题。实际数据显示,正确优化后查询性能通常可提升10-100倍[^4][^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值