
MySQL是目前业界最为流行的关系型数据库之一,而索引的优化也是数据库性能优化的关键之一。所以,充分地了解MySQL索引有助于提升开发人员对MySQL数据库的使用优化能力。
MySQL的索引有很多种类型,可以为不同的场景提供更好的性能。而B-Tree索引是最为常见的MySQL索引类型,一般谈论MySQL索引时,如果没有特别说明,就是指B-Tree索引。本文就详细讲解一下B-Tree索引的的底层结构,使用原则和特性。
为了节约你的时间,本文的主要内容如下:
- B-Tree索引的底层结构
- B-Tree索引的使用规则
- 聚簇索引
- InnoDB和MyISAM引擎索引的差异
- 松散索引
- 覆盖索引
B-Tree索引
B-Tree索引使用B-Tree来存储数据,当然不同存储引擎的实现方式不同。B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,图1展示了B-Tree索引的抽象表示,由此可以看出MySQL的B-Tree索引的大致工作机制。
B-Tree索引的底层数据结构一般是B+树,其具体数据结构和优势这里就不作详细描述,图1展示了B-树索引的抽象表示,大致反应了MyISAM索引是如何工作的,而InnoDB使用的结构有所不同。

MySQL可以在单独一列上添加B-Tree索引,也可以在多列数据上添加B-Tree索引,多列的数据按照添加索引声明的顺序组合起来,存储在B-Tree的页中。假设有如下数据表:
sql CREATE TABLE People ( last_name varchar(50) not null, first_name varchar(50) not null, birthday date not null, gender enum('m','f') not null key(last_name, first_name, birthday) ); ¨G0G mysql>SELECT * FROM tb1 WHERE b BETWEEN 2 AND 3; ¨G1G mysql> EXPLAIN SELECT actor_id, MAX(film_id) -> FROM sakila.film.film_actor -> GROUP BY actor_id; ********************************************* 1. row *********************************** id: 1 select_type: SIMPLE table: film_actor type: range possible_keys: NULL key: PRIMARY key_len: 2 ref: NULL rows: 396 Extra: Using index for group-by ¨G2G mysql> EXPLAIN SELECT store_id, film_id FROM sakila.inventory *********************************1.row*************************************** id:1 select_type:SIMPLE table:inventory type:index possible_keys:NULL key:idx_store_id_film_id key_len:3 ref:NULL rows:4673 Extra:Using Index
订阅最新文章,欢迎关注我的微信公众号

参考:
- MySQL索引背后的数据结构及算法原理
- 《高性能MySQL》