执行计划
使用EXPLAIN 分析 SQL 执行计划。
关键字段
| 字段 | 说明 | 关注点 |
|---|---|---|
| type | 访问类型 | 越快越好 |
| key | 实际使用的索引 | 是否使用索引 |
| rows | 预估扫描行数 | 越少越好 |
| Extra | 额外信息 | 是否有优化空间 |
type 访问类型
从好到差排序:| 类型 | 说明 |
|---|---|
| system | 表只有一行 |
| const | 主键/唯一索引等值查询 |
| eq_ref | 主键/唯一索引连接 |
| ref | 普通索引等值查询 |
| range | 索引范围查询 |
| index | 全索引扫描 |
| ALL | 全表扫描(最差) |
Extra 常见值
| 值 | 说明 | 建议 |
|---|---|---|
| Using index | 覆盖索引 | ✅ 好 |
| Using where | 使用 WHERE 过滤 | 正常 |
| Using temporary | 使用临时表 | ⚠️ 需优化 |
| Using filesort | 文件排序 | ⚠️ 需优化 |
| Using index condition | 索引条件下推(ICP) | ✅ 好 |
慢查询
开启慢查询日志
分析慢查询
常见慢查询原因
| 原因 | 解决方案 |
|---|---|
| 未使用索引 | 添加索引 |
| 索引失效 | 优化 SQL |
| 返回数据过多 | 分页、减少 SELECT * |
| 关联表过多 | 减少 JOIN |
| 子查询效率低 | 改为 JOIN |
| 排序数据量大 | 添加排序字段索引 |
SQL 优化
SELECT 优化
JOIN 优化
ORDER BY 优化
GROUP BY 优化
LIMIT 优化
INSERT 优化
UPDATE/DELETE 优化
表结构优化
数据类型选择
| 原则 | 说明 |
|---|---|
| 小而够用 | TINYINT 比 INT 省空间 |
| 整型优于字符 | INT 比 VARCHAR 查询快 |
| 避免 NULL | NULL 需要额外空间,索引复杂 |
| 定长优于变长 | CHAR 比 VARCHAR 快 |
大表优化
| 方案 | 说明 | 适用场景 |
|---|---|---|
| 垂直拆分 | 按字段拆分 | 大字段分离 |
| 水平拆分 | 按行拆分 | 数据量大 |
| 冷热分离 | 冷数据归档 | 历史数据 |
| 归档 | 定期清理或归档 | 日志类数据 |
配置优化
内存相关
连接相关
日志相关
优化检查清单
| 检查项 | 方法 |
|---|---|
| 是否使用索引 | EXPLAIN 查看 key 字段 |
| 索引是否失效 | 检查 type 是否为 ALL |
| 是否有文件排序 | Extra 是否有 filesort |
| 是否有临时表 | Extra 是否有 temporary |
| 扫描行数是否过多 | 查看 rows 字段 |
| 是否返回过多数据 | 检查 SELECT 字段 |
| 连接表是否过多 | 控制 JOIN 数量 |
| 是否有深分页 | 优化 LIMIT |