深入浅出 MySQL 回表查询与索引优化
回表查询详解
基本概念
InnoDB存储引擎中的索引分为两种类型:
- 聚簇索引:叶子节点存储完整的行记录数据
- 辅助索引:叶子节点只存储索引字段值和对应记录的主键值
回表查询机制
回表查询是指当使用辅助索引进行查询时,需要两次访问索引树:
- 第一次:通过辅助索引找到主键值
- 第二次:用主键值到聚簇索引中查找完整记录
性能分析
- 需要两次索引查找
- 可能需要两次磁盘IO
覆盖索引详解
概念定义
覆盖索引是一种索引优化技术,当查询所需的所有列都包含在索引中时,可以直接使用索引数据来满足查询。
性能优势
- 减少I/O操作
- 提高查询速度
- 降低资源消耗
实现方法
-- 创建覆盖索引
ALTER TABLE users ADD INDEX idx_name_age (name, age);
-- 使用覆盖索引
SELECT name, age FROM users WHERE name = 'John';
最左前缀原则详解
原理说明
最左前缀原则规定在使用复合索引时,查询条件必须从索引的最左侧列开始才能有效利用索引。
具体表现
- 从最左列开始查询:有效使用索引
- 跳过中间列的失效:只能用到部分索引
- 不包含最左列的完全失效:索引无法使用
特殊情况
- 范围查询后的列失效
- 优化器自动调整
MySQL LIKE 查询与索引使用
索引使用情况
- ‘%name%‘:索引不起作用
- ‘%name’:索引不起作用
- ‘name%‘:索引可以起作用
MySQL 中 NULL 值对索引的影响
NULL 值的特性
- 不能使用普通的等于(=)运算符比较,必须使用 IS NULL 或 IS NOT NULL
- 任何包含 NULL 的算术运算结果都是 NULL
- COUNT() 不会统计 NULL 值行
最佳实践
- 尽量将列设置为 NOT NULL 并设置合理的默认值
- NOT NULL 列通常有更好的查询性能