MySQL索引结构:B树与B+树
MySQL索引结构:B树与B+树
B树和B+树是MySQL索引的底层数据结构,但实际实现中InnoDB引擎默认使用B+树。
B树特点
- 每个节点存储键值和数据,可能导致非叶子节点数据占用空间大。
- 所有节点都可能包含数据,查询效率不稳定。
B+树特点
- 非叶子节点仅存储键值(索引),数据全部存储在叶子节点。
- 叶子节点通过指针连接,支持高效的范围查询。
- 更矮的树高,减少磁盘I/O次数。
聚集索引与非聚集索引
聚集索引
- 叶子节点直接存储行数据,表数据按索引顺序物理排序。
- InnoDB中主键默认为聚集索引,若未定义主键,则选择第一个唯一非空索引替代。
非聚集索引(二级索引)
- 叶子节点存储主键值而非行数据,查询需回表(通过主键二次查找)。
- 一个表可有多个非聚集索引。
示例代码
创建表并定义索引
-- 创建包含聚集索引(主键)和非聚集索引的表
CREATE TABLE employees (id INT PRIMARY KEY, -- 聚集索引name VARCHAR(50),age INT,department VARCHAR(50),INDEX idx_name_age (name, age), -- 非聚集索引(复合索引)INDEX idx_department (department) -- 非聚集索引
) ENGINE=InnoDB;
插入测试数据
INSERT INTO employees VALUES
(1, 'Alice', 28, 'HR'),
(2, 'Bob', 32, 'Engineering'),
(3, 'Charlie', 25, 'Marketing');
查询示例
-- 使用聚集索引(主键)查询
SELECT * FROM employees WHERE id = 2;-- 使用非聚集索引查询(需回表)
EXPLAIN SELECT * FROM employees WHERE name = 'Alice';-- 覆盖索引优化(避免回表)
EXPLAIN SELECT name, age FROM employees WHERE name = 'Alice';
索引使用分析
-- 查看索引使用情况
SHOW INDEX FROM employees;-- 查询优化器分析
EXPLAIN SELECT * FROM employees WHERE department = 'Engineering';
关键注意事项
- 聚集索引的列选择应避免频繁更新,否则可能导致页分裂影响性能。
- 复合索引需遵循最左前缀原则,例如
idx_name_age
索引对WHERE name='Alice'
有效,但对WHERE age=25
无效。 - 使用
EXPLAIN
分析查询计划,确认是否命中索引。
通过合理设计索引结构(如B+树特性)和索引类型(聚集/非聚集),可显著提升MySQL查询效率。