SQL审查与优化
使用场景
审查SQL语句,发现性能问题并提供优化建议。
审查规则
🔴 严重问题
-
**SELECT ***
- 问题:查询所有字段,浪费资源
- 修复:只查询需要的字段
-
缺少WHERE条件
- 问题:全表扫描
- 修复:添加必要的过滤条件
-
隐式类型转换
- 问题:字段类型不匹配导致索引失效
- 示例:
WHERE phone = 13800138000(phone是varchar) - 修复:
WHERE phone = '13800138000'
-
前导通配符
- 问题:
LIKE '%keyword'无法使用索引 - 修复:考虑全文索引
- 问题:
🟡 性能问题
-
N+1查询
- 问题:循环中执行查询
- 修复:使用JOIN或批量查询
-
子查询效率低
- 问题:相关子查询
- 修复:改用JOIN
-
缺少索引
- 问题:WHERE/JOIN字段未建索引
- 修复:添加合适索引
-
排序未使用索引
- 问题:ORDER BY字段无索引
- 修复:添加联合索引
🟢 优化建议
-
分页优化
-- 慢:OFFSET大时性能差 SELECT * FROM orders LIMIT 10 OFFSET 10000; -- 快:使用游标分页 SELECT * FROM orders WHERE id > 10000 LIMIT 10; -
批量操作
-- 慢 INSERT INTO users (name) VALUES ('张三'); INSERT INTO users (name) VALUES ('李四'); -- 快 INSERT INTO users (name) VALUES ('张三'), ('李四'); -
EXPLAIN分析
EXPLAIN SELECT * FROM users WHERE phone = '13800138000'; -- 查看 type、key、rows 字段
输出格式
SQL审查报告
━━━━━━━━━━━━━━━━━━━━━━━━
原始SQL: SELECT * FROM users WHERE phone = 13800138000
问题:
🔴 [严重] SELECT * - 建议只查询需要的字段
🔴 [严重] 隐式类型转换 - phone字段应使用字符串
🟡 [建议] phone字段建议添加索引
优化后:
SELECT id, name, phone FROM users WHERE phone = '13800138000';
建议索引:
CREATE INDEX idx_phone ON users(phone);
