MySQL 查询优化详解:从执行计划到实战优化

前言

在数据量爆发式增长的今天,MySQL 查询性能成为系统瓶颈的高频场景。一条低效 SQL 可能拖慢整个业务链路,而合理的优化能让查询性能提升几个数量级。本文从查询分析工具、索引优化、语句调优到架构级优化,结合真实案例与代码示例,带你掌握 MySQL 查询优化的核心方法论。


一、查询分析:从执行计划开始

1. EXPLAIN:SQL 执行的 “X 光片”

通过EXPLAIN分析执行计划,重点关注 3 个核心指标:

EXPLAIN SELECT * FROM orders WHERE status = 1 AND create_time > '2023-01-01';
(1)type:访问类型(效率从高到低)
类型 说明 示例场景
const 单条记录匹配(主键 / 唯一索引) WHERE id = 1
eq_ref 多表 JOIN 时的唯一匹配 主键关联 JOIN
range 索引范围查询 WHERE id > 100
index 全索引扫描(优于全表扫描) SELECT id FROM table
ALL 全表扫描(最差情况) 无索引或索引失效
(2)rows:预估扫描行数
  • 理想值:接近实际返回行数,越小越好
  • 优化目标:通过索引将rows从百万级降至千级
(3)Extra:额外信息
  • Using index:覆盖索引,无需回表
  • Using filesort:文件排序(需优化 ORDER BY)
  • Using temporary:创建临时表(分组 / 排序优化重点)

2. SHOW PROFILE:精准定位耗时环节

-- 开启 profiling
SET profiling = 1;

-- 执行查询
SELECT * FROM orders WHERE user_id = 123;

-- 获取 profiling 结果
SHOW PROFILE FOR QUERY LAST;

重点关注send data阶段:占比过高说明数据传输或计算耗时,可能需减少返回字段。


二、索引优化:查询加速的核心引擎

1. 索引设计三原则

(1)最左匹配原则

场景:联合索引(a, b, c)支持的查询模式:

-- 有效:使用全部/部分左前缀
WHERE a=1 AND b=2 AND c=3  
WHERE a=1 AND b=2           -- 用到a,b  
WHERE a=1                   -- 用到a  

-- 无效:跳过左字段
WHERE b=2 AND c=3           -- 索引失效
(2)区分度优先策略

计算字段区分度(越高越好):

SELECT COUNT(DISTIN

你可能感兴趣的:(mysql,mysql,数据库,后端,java,sql)