mysql 慢查询

  1. 开启慢查询日志
    SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1; -- 超过 1s 记录 SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
  2. 用 mysqldumpslow 分析日志
    # 按总耗时排序,取 Top 10 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
  3. 使用 EXPLAIN 分析执行计划
    EXPLAIN SELECT * FROM orders WHERE user_id=100 AND status='pending'; -- 重点关注:type(ALL=全表扫描), rows, key, Extra
  4. 查询 performance_schema 实时 Top SQL
    SELECT digest_text, count_star, avg_timer_wait/1e12 AS avg_sec FROM performance_schema.events_statements_summary_by_digest ORDER BY avg_timer_wait DESC LIMIT 10;
索引优化

为 WHERE/ORDER BY/GROUP BY 字段建立合适索引;删除冗余索引;使用联合索引覆盖查询字段。

-- 添加联合索引 ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
SQL 改写

避免 SELECT *;用 LIMIT 分页;避免函数作用于索引列;改写子查询为 JOIN。

-- 避免 WHERE YEAR(create_time) = 2025 -- 改为 WHERE create_time >= '2025-01-01' AND create_time < '2026-01-01'
分页优化

LIMIT 偏移量大时性能急剧下降,使用游标分页替代。

-- 慢(LIMIT 100000, 20) -- 改为游标分页 WHERE id > :last_id LIMIT 20
配置调优

适当增大 innodb_buffer_pool_size(建议物理内存 70%);启用 Query Cache(5.7)或升级 8.0 用连接池缓存。

上一篇 网络运维服务方案不求人!分享一套覆盖所有场景的实用方案
下一篇 linux mysql查看初始密码