为什么要对 SQL 进行优化
数据库性能瓶颈往往源于执行时间过长、等待资源或 SQL 语句设计欠佳(如连接查询不当、索引失效)。这些问题会严重拖慢系统响应,因此掌握 SQL 优化至关重要。
理解 SQL 的执行顺序是优化的基础。虽然编写时我们习惯 select..from..join..on..where..group by...having..order by...limit 的顺序,但解析引擎实际的处理流程是从 from 开始,经过 join, where, group by 等步骤,最后才执行 select 和 order by。
SQL 优化的核心:索引
索引相当于书的目录,是帮助 MySQL 高效获取数据的数据结构。查字典时若有目录只需按图索骥,若无则需遍历整本。常见的索引数据结构包括 B+ 树(默认)、Hash 树等。
索引的利弊权衡
优势在于提高查询效率(降低 IO)和降低 CPU 使用率。但索引本身占用存储空间(通常存于硬盘),且会降低增删改的效率。并非所有场景都适用,少量数据、频繁更新的字段或很少使用的字段通常不建议建立索引。
索引分类与创建
- 单值索引:单列索引,如学生表的 name 字段。
- 唯一索引:属性不能重复,如主键 id。
- 主键索引:内容不能为 null 的唯一索引。
- 复合索引:多列构成,如 (name, grade),先查 name 再查 grade。
创建索引主要有两种方式:
-- 方式一:CREATE INDEX
CREATE INDEX name_index ON student(name);
CREATE UNIQUE INDEX id_index ON student(id);
CREATE INDEX name_grade_index ON student(name, grade);
-- 方式二:ALTER TABLE
ALTER TABLE student ADD INDEX name_index(name);
ALTER TABLE student ADD UNIQUE INDEX id_index(id);
ALTER TABLE student ADD INDEX name_grade_index(name, grade);
删除索引也很简单:
DROP INDEX 索引名 ON 表名;
深入理解 EXPLAIN
EXPLAIN 是查找慢 SQL 原因的神器。在 SQL 前加上该关键字即可查看执行计划。重点关注 type、key、key_len 和 Extra 字段。
- id:标识符。相同 id 顺序执行,不同 id 越大越优先。


