在 MySQL 中,SQL 优化是性能调优的核心环节,尤其是在数据量大、并发高的情况下。这里整理一份 MySQL 常见 SQL 语句优化指南,从查询写法、索引使用到执行计划分析,涵盖实用技巧:
1. 查询语句层面的优化
✅ 避免 SELECT *
- 问题:会取出不必要的列,增加 I/O 和网络传输。
- 优化:只取需要的列。
-- 不推荐
SELECT * FROM user;-- 推荐
SELECT id, username, email FROM user;
✅ 减少子查询,优先使用 JOIN
- 问题:子查询可能生成临时表,效率低。
- 优化:能用
JOIN
就不用子查询。
-- 子查询
SELECT name FROM employee WHERE dept_id IN (SELECT id FROM department WHERE name = '研发部'
);-- JOIN 优化
SELECT e.name
FROM employee e
JOIN department d ON e.dept_id = d.id
WHERE d.name = '研发部';
✅ 合理使用 LIMIT
- 问题:
LIMIT offset, size
偏移量大时性能差。 - 优化:利用索引字段加条件过滤。
-- 慢
SELECT * FROM orders LIMIT 100000, 20;-- 推荐(基于自增主键优化)
SELECT * FROM orders
WHERE id > 100000
LIMIT 20;
✅ 避免 OR
,改用 IN
或 UNION ALL
- 问题:
OR
会导致索引失效。 - 优化:使用
IN
或UNION ALL
。
-- 不推荐
SELECT * FROM user WHERE status = 1 OR status = 2;-- 推荐
SELECT * FROM user WHERE status IN (1, 2);
✅ 模糊查询优化
-
问题:
LIKE '%abc'
不能走索引。 -
优化:
- 改写为
LIKE 'abc%'
(前缀匹配可以走索引)。 - 或者使用 全文索引 (FULLTEXT) / ElasticSearch。
- 改写为
-- 慢
SELECT * FROM article WHERE title LIKE '%优化%';-- 推荐
ALTER TABLE article ADD FULLTEXT(title);
SELECT * FROM article WHERE MATCH(title) AGAINST('优化');
✅ 避免在 WHERE 中对列做函数运算
- 问题:索引失效。
- 优化:把函数移到等式右边。
-- 不推荐
SELECT * FROM user WHERE YEAR(create_time) = 2024;-- 推荐
SELECT * FROM user
WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01';
2. 索引使用优化
✅ 建立合适的索引
- 单列索引:适合高频查询字段。
- 复合索引:遵循 最左前缀原则。
CREATE INDEX idx_user_email ON user(email);
CREATE INDEX idx_order_user_time ON orders(user_id, create_time);
✅ 覆盖索引 (Covering Index)
- 查询字段都在索引中,不需要回表。
-- 索引包含 (user_id, create_time)
SELECT user_id, create_time
FROM orders
WHERE user_id = 123;
✅ 避免过多索引
- 问题:索引会增加写操作开销。
- 优化:只在查询频繁的字段建索引,删除无用索引。
3. 执行计划分析
✅ 使用 EXPLAIN
分析查询是否走索引。
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
重点关注字段:
type
:优先级system > const > eq_ref > ref > range > index > ALL
key
:实际使用的索引rows
:扫描行数,越少越好
4. 表结构与数据优化
- 分库分表:大表 (>千万行) 考虑拆分。
- 冷热数据分离:历史数据归档,减少主表数据量。
- 合理字段类型:能用
INT
不用BIGINT
,能用CHAR(10)
不用VARCHAR(255)
。
5. 常见优化 checklist
- 是否避免了
SELECT *
- 是否有合适的索引
- 是否避免在索引列上使用函数、计算
- 是否避免大 offset 的分页
- 是否利用了
EXPLAIN
分析执行计划