SQL 优化技巧大全:让你的查询快 10 倍

收集整理 SQL 优化的实用技巧,包括索引使用、查询重写、分页优化等。

数据库 2026-06-21 10 分钟

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 优化的核心是减少扫描行数、避免索引失效、合理使用索引。通过这些技巧,可以大幅提升查询性能。

📚 相关文章