MySQL索引的原理,B+树、聚集索引和二级索引的结构分析( 二 )
一些限制:
- 如果不是按照索引的最左列开始查找,无法使用索引 。例如上面例子中的索引无法用于查找某个特定生日的人,因为生日不是最左数据列 。也不能查找last_name以某个字母结尾的人 。
- 不能跳过索引的列 。上述索引无法用于查找last_name为Smith并且某个特定生日的人 。如果不指定first_name,则mysql只能使用索引的第一列 。
- 如果查询中有某个列的范围查询,则右边所有的列都无法使用索引优化查找 。例如查询WHERE last_name=’Smith’ AND first_name LIKE ‘J%’ AND birthday=‘1996-05-19’,这个查询只能使用索引的前两列 。
因为索引自身只存储对应的哈希值,所以索引的结构十分紧凑,哈希索引查找的速度非常快 。但是哈希索引也有它的限制:
- 哈希索引不是按照索引顺序存储的,无法用于排序 。
- 不支持部分索引列匹配查找 。
- 不支持范围查找 。
因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚集索引 。InnoDB表中聚集索引的索引列就是主键,所以聚集索引也叫主键索引 。
例如下面这张InnoDB表:
create table Student( id int(11) primary key auto_increment, last_name varchar(50) not null,first_name varchar(50) not null,birthday date not null);聚集索引(主键索引)的结构如下图:

文章插图
这是一课B+树,它的叶子页包含了行的全部数据,节点页只包含了索引列(即主键) 。
二级索引(secondary indexes)对于InnoDB表,在非主键列的其他列上建的索引就是二级索引(因为聚集索引只有一个) 。二级索引可以有0个,1个或者多个 。二级索引和聚集索引的区别是什么呢?二级索引的节点页和聚集索引一样,只存被索引列的值,而二级索引的叶子页除了索引列值,还存这一列对应的主键值 。
InnoDB和MyISAM的数据分布对比
以下表为例,我们看下InnoDB和MyISAM是如何存储这个表的:
create table layout_test( col1 int(11) primary key,col2 int(11) not null,key(col2));

文章插图
InnoDB表的数据分布
聚集索引(主键索引)分布如下:

文章插图
可以看到,叶子节点存储了整个表的数据,而不是只有索引列,每个叶子节点包含了主键值、事务ID、用于事务和MVCC的回滚指针以及所有的剩余列(col2) 。
二级索引分布如下:

文章插图
二级索引的叶子节点中存储的不是“行指针”,而是主键值,并以此作为指向行的“指针” 。这样的策略减少了当出现行移动或者数据页分裂时二级索引的维护工作 。使用主键当做指针会让二级索引占更多空间,但好处是InnoDB在移动行时无需更新二级索引中的这个指针 。
MyISAM表的数据分布
col1列上的索引:

文章插图
col2列上的索引:

文章插图
实际上MyISAM中主键索引和其他索引在结构上没有什么不同 。
从下图可以看出InnoDB和MyISAM保存数据和索引的区别 。

文章插图
聚集索引的优点:
- 可以把相关数据保存在一起,例如实现电子邮箱时,根据用户ID来聚集数据,读取少数的数据页就能获取某个用户的全部邮件 。
- 聚集索引将索引和数据保存在同一个B树中,因此从聚集索引中获取数据比在非聚集索引中要快一些 。
推荐阅读
- 古丈毛尖的功效与作用古丈毛尖是什么茶
- 超详细的mysql数据库主备切换演练教程,值得收藏
- 碧螺春茶的功效与禁忌
- 立顿绿茶的功效与作用
- 防止网站被iframe内框架调用的方法
- WEB验证的过去现在与未来
- 聊聊java中的进制问题
- mysql导入数据
- 烤箱做蛋糕回缩的原因 烤箱做蛋糕会回缩是怎么回事
- 微信公众号的推广渠道和方法