
一、SQL 性能优化的目标优化 SQL 的核心目标减少扫描的数据量 排序成本 临时表创建 磁盘 IO例如查询 1000 万数据差的 SQL扫描 1000 万行 排序 返回 10 条好的 SQL通过索引定位 扫描 10 行 返回结果二、避免 SELECT *⭐⭐⭐⭐⭐不推荐SELECT * FROM user;推荐SELECT id, username, age FROM user;为什么① 增加网络传输例如用户表id username password avatar description create_time update_time如果SELECT *返回全部字段。但是页面只需要username avatar多余数据也会传输。② 影响索引覆盖例如索引(username, age)查询SELECT username, age FROM user;MySQL直接从索引获取。叫覆盖索引但是SELECT * FROM user;需要索引↓回表↓查询完整数据效率下降。三、合理使用索引索引不是随便加。1. 经常作为查询条件例如SELECT * FROM user WHERE phone13800000000;建议CREATE INDEX idx_phone ON user(phone);2. 经常排序例如SELECT * FROM order ORDER BY create_time DESC;建议CREATE INDEX idx_time ON order(create_time);3. 经常 JOIN例如SELECT * FROM orders o JOIN user u ON o.user_idu.id;建议CREATE INDEX idx_user_id ON orders(user_id);四、联合索引优化 ⭐⭐⭐⭐⭐例如创建CREATE INDEX idx_name_age ON user(name, age);这个索引实际上是name ↓ age满足可以使用①WHERE nameTom✅②WHERE nameTom AND age20✅③WHERE nameTom ORDER BY age✅不推荐WHERE age20❌原因违反最左匹配原则例如索引(name, age, address)匹配name name age name age address但是age address无法有效利用。五、避免索引失效 ⭐⭐⭐⭐⭐1. 不要对索引字段做计算错误SELECT * FROM user WHERE id 1 10;原因MySQL需要计算每一行。正确WHERE id 9;2. 不要使用函数错误WHERE YEAR(create_time)2026;推荐WHERE create_time 2026-01-01 AND create_time 2027-01-01;3. LIKE 不要以 % 开头错误WHERE name LIKE %Tom;原因不知道从哪里开始查。可以WHERE name LIKE Tom%;六、分页优化 ⭐⭐⭐⭐⭐这是企业非常常见的问题。普通分页例如第一页SELECT * FROM user LIMIT 0,20;很好。第100万页SELECT * FROM user LIMIT 1000000,20;问题MySQL需要扫描前1000020条 丢弃1000000条 返回20条非常慢。七、深分页优化方法1记录最后ID例如第一页SELECT * FROM user ORDER BY id LIMIT 20;返回最后id20下一页SELECT * FROM user WHERE id20 ORDER BY id LIMIT 20;优势直接定位。方法2覆盖索引优化先查 IDSELECT id FROM user LIMIT 1000000,20;然后根据 ID 查询SELECT * FROM user WHERE id IN(...)减少回表。八、减少不必要排序例如SQLSELECT * FROM user ORDER BY create_time;如果没有索引执行查询全部 排序EXPLAIN可能出现Using filesort优化CREATE INDEX idx_create_time ON user(create_time);九、减少临时表例如SELECT age,COUNT(*) FROM user GROUP BY age;可能创建临时表优化给分组字段建立索引CREATE INDEX idx_age ON user(age);十、批量操作优化不推荐循环for(User user:list){ insert(user); }执行10000次SQL推荐批量INSERT INTO user VALUES (1,Tom), (2,Jack), (3,Lucy);一次提交。优势减少网络通信SQL解析事务提交次数十一、慢查询优化流程企业流程发现接口慢↓查看慢 SQL↓执行EXPLAIN↓分析type key rows Extra↓优化可能方案增加索引 修改SQL 调整分页 减少字段↓再次测试。十二、SQL优化原则总结优化方向方法减少查询字段避免 SELECT *减少扫描合理索引避免索引失效不要函数、计算、前置%优化分页避免深分页减少排序建立排序字段索引减少临时表优化 GROUP BY减少交互批量操作十三、本节核心一句话SQL 优化的本质就是让 MySQL 少扫描数据、少计算、少排序通过索引快速定位目标数据。