MySQL SQL优化快速入门
1. SQL优化的目的
- 减少磁盘IO(少读数据)、减少CPU计算(少做排序/临时表)、缩短查询时间。
性能判断
如何判断:
通过explain +需要优化的语句
explain select * from tb_user where profession ='软件工程' ;通过type字段判断性能type 性能由好到差的连接类型为:
NULL >system>const>eq_ref>ref>range>index>all总结:
唯一索引 type 一般为 const 普通索引 type为 ref
2.慢查询优化基础步骤
找慢查询:开启MySQL慢查询日志(slow_query_log=ON),定位执行时间长的SQL;
分析执行计划:用EXPLAIN看SQL执行逻辑(重点看type/key/Extra);
- type:ALL(全表扫描,最差)→ ref(普通索引)→ eq_ref(主键索引,最优);
- Extra:Using index(覆盖索引,最优)、Using filesort(文件缓冲区排序,要优化);
- 优化:加索引/改写SQL/调整索引。
3.通用SQL优化基础技巧
- 禁用SELECT *:只查需要的字段(触发覆盖索引,减少回表);
- 优化分页查询:避免大偏移量(LIMIT 100000, 10),改用主键范围(WHERE id>100000 LIMIT 10);
- 批量操作:插入用INSERT INTO ... VALUES (),(),()(MyBatis批量插入),避免循环单条;
- 避免子查询:子查询改JOIN(减少临时表);
- 大表查询:拆分查询(如按时间分段查),避免一次性查全量。
- 建立联合索引减少回表
4.常见慢查询场景优化(基础)
慢查询场景 | 优化方案 |
SELECT * FROM user WHERE age=20 | 给age建普通索引,改SELECT id,age触发覆盖索引 |
LIMIT 100000, 10 | 用主键范围:WHERE id>100000 LIMIT 10 |
UPDATE user SET age=20 WHERE name='张三' | 给name建索引(避免锁全表) |
