SQL 优化技巧大全:让你的查询快 10 倍
SQL 优化是数据库性能的关键。本文收集整理 SQL 优化的实用技巧。
1. 使用索引
-- 为常用查询字段添加索引
CREATE INDEX idx_status ON orders(status);
CREATE INDEX idx_user_status ON orders(user_id, status);
2. 避免 SELECT *
-- ❌ 查询所有字段
SELECT * FROM users WHERE id = 1;
-- ✅ 只查询需要的字段
SELECT name, email FROM users WHERE id = 1;
3. 避免索引失效
-- ❌ 函数操作
SELECT * FROM users WHERE YEAR(created_at) = 2024;
-- ✅ 范围查询
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
-- ❌ 隐式类型转换
SELECT * FROM users WHERE phone = 13800138000;
-- ✅ 类型匹配
SELECT * FROM users WHERE phone = '13800138000';
4. 分页优化
-- ❌ 深分页
SELECT * FROM users ORDER BY id LIMIT 1000000, 10;
-- ✅ 使用游标
SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;
-- ✅ 延迟关联
SELECT u.* FROM users u
INNER JOIN (SELECT id FROM users ORDER BY id LIMIT 1000000, 10) t
ON u.id = t.id;
5. JOIN 优化
-- 确保关联字段有索引
CREATE INDEX idx_user_id ON orders(user_id);
-- 小表驱动大表
SELECT * FROM small_table s
JOIN big_table b ON s.id = b.sid;
6. 子查询优化
-- ❌ 子查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
-- ✅ JOIN
SELECT DISTINCT u.* FROM users u
JOIN orders o ON u.id = o.user_id;
7. 批量操作
-- ❌ 逐条插入
INSERT INTO users (name) VALUES ('a');
INSERT INTO users (name) VALUES ('b');
-- ✅ 批量插入
INSERT INTO users (name) VALUES ('a'), ('b'), ('c');
8. 使用 LIMIT
-- 只需要一条记录时
SELECT * FROM users WHERE status = 1 LIMIT 1;
9. 避免 OR
-- ❌ OR
SELECT * FROM users WHERE status = 1 OR status = 2;
-- ✅ IN
SELECT * FROM users WHERE status IN (1, 2);
10. 使用覆盖索引
-- 索引:(name, age)
SELECT name, age FROM users WHERE name = '张三';
总结
SQL 优化的核心是减少扫描行数、避免索引失效、合理使用索引。通过这些技巧,可以大幅提升查询性能。