全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-15 7 分钟 ✍️ juanwangdev

MySQL 查询优化

查询优化通过改进SQL语句结构,充分利用索引,减少资源消耗,提升查询效率。

避免 SELECT *

SQL
-- ✗ 查询所有列,浪费资源
SELECT * FROM users;

-- ✓ 只查询需要的列
SELECT id, name FROM users;

-- ✓ 使用覆盖索引
CREATE INDEX idx_name ON users(name);
SELECT name FROM users WHERE name = '张三';  -- 覆盖索引

分页优化

SQL
-- ✗ 大偏移量分页效率低
SELECT * FROM users LIMIT 10000, 10;
-- 需扫描前10010行再返回10行

-- ✓ 使用WHERE条件优化
SELECT * FROM users WHERE id > 10000 LIMIT 10;

-- ✓ 使用子查询
SELECT * FROM users
WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 10000, 1)
LIMIT 10;

-- ✓ 使用JOIN
SELECT u.* FROM users u
INNER JOIN (SELECT id FROM users ORDER BY id LIMIT 10000, 10) t
ON u.id = t.id;

避免子查询

SQL
-- ✗ 子查询效率低(临时表)
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);

-- ✓ 使用JOIN替代
SELECT u.* FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.amount > 1000;

-- ✓ 使用EXISTS替代IN
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.amount > 1000);

JOIN优化

SQL
-- ✓ 小表驱动大表
-- LEFT JOIN时左表尽量小
SELECT * FROM small_table s
LEFT JOIN large_table l ON s.id = l.id;

-- ✓ 使用索引关联字段
CREATE INDEX idx_user_id ON orders(user_id);
SELECT * FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- ✓ 减少JOIN表数量
-- 超过3个表的JOIN需拆分

-- ✓ 避免复杂JOIN条件
-- JOIN条件尽量用索引字段

ORDER BY优化

SQL
-- ✓ 利用索引排序
CREATE INDEX idx_create_time ON users(create_time);
SELECT * FROM users ORDER BY create_time;  -- Using index

-- ✗ 无索引排序效率低
SELECT * FROM users ORDER BY RAND();  -- 临时表+文件排序

-- ✓ 组合索引排序
CREATE INDEX idx_age_name ON users(age, name);
SELECT * FROM users ORDER BY age, name;  -- 使用索引

-- ✗ 顺序不一致
SELECT * FROM users ORDER BY name, age;  -- 索引失效

-- ✓ 相同排序方向
SELECT * FROM users ORDER BY age ASC, name ASC;  -- 使用索引
-- ✗ 不同排序方向
SELECT * FROM users ORDER BY age ASC, name DESC;  -- 索引失效

GROUP BY优化

SQL
-- ✓ 利用索引分组
CREATE INDEX idx_dept ON users(dept);
SELECT dept, COUNT(*) FROM users GROUP BY dept;  -- Using index

-- ✗ 无索引分组效率低
SELECT name, COUNT(*) FROM users GROUP BY name;

-- ✓ 避免临时表
-- 分组字段尽量有索引
-- 结果尽量有序

-- ✓ 使用WHERE减少分组数据量
SELECT dept, COUNT(*) FROM users
WHERE status = 'active'
GROUP BY dept;

DISTINCT优化

SQL
-- ✗ DISTINCT效率低
SELECT DISTINCT name FROM users;

-- ✓ 使用GROUP BY替代
SELECT name FROM users GROUP BY name;

-- ✓ DISTINCT配合索引
CREATE INDEX idx_name ON users(name);
SELECT DISTINCT name FROM users;  -- 使用索引

批量操作优化

SQL
-- ✗ 单条INSERT效率低
INSERT INTO users VALUES (1, '张三');
INSERT INTO users VALUES (2, '李四');
INSERT INTO users VALUES (3, '王五');

-- ✓ 批量INSERT
INSERT INTO users VALUES (1, '张三'), (2, '李四'), (3, '王五');

-- ✓ 使用LOAD DATA批量导入
LOAD DATA INFILE 'users.csv' INTO TABLE users;

-- ✓ 批量UPDATE减少事务
UPDATE users SET status = 'active' WHERE id IN (1, 2, 3);

使用LIMIT

SQL
-- ✓ LIMIT限制结果集
SELECT * FROM users WHERE name LIKE '张%' LIMIT 100;

-- ✓ 查询是否存在用LIMIT 1
SELECT 1 FROM users WHERE email = 'test@test.com' LIMIT 1;

-- ✓ 防止全表扫描
SELECT * FROM orders WHERE user_id = 100 LIMIT 10;

要点总结

  • 避免 SELECT *,只查需要的列
  • 大分页用 WHERE 条件优化
  • 子查询用 JOIN 或 EXISTS 替代
  • ORDER BY/GROUP BY 利用索引
  • 批量操作合并执行
  • LIMIT 限制结果集,减少资源消耗

📝 发现内容有误?点击此处直接编辑

← 上一篇 MySQL 执行计划分析
下一篇 → MySQL 索引优化策略
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库