动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

InnoDB索引模型详解

05-08 16:00 1886浏览
举报 T字号
  • 大字
  • 中字
  • 小字

InnoDB在MySQL5.5版本以后已经成为MySQL的默认存储引擎,我们来分析一个InnoDB的索引模型。InnoDB采用B+树的索引模型,InnoDB的主键索引是聚簇索引。

聚簇索引与非聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。当表有聚簇索引时,它的数据行实际上是放在索引的叶子节点上。相应的如果数据行是单独存放,而索引的叶子节点只保存了数据行指针的存储方式就是非聚簇索引。因为不可能把数据行同时放在两个不同的地方,所以一个表最多只能有一个聚簇索引。

然后我们比较一下聚簇索引与非聚簇索引的存储特性。直接引用《高性能MySQL》一书中关于聚簇索引与非聚簇索引比较的图片。左边是聚簇索引和主键索引和二级索引,右边是非聚簇索引的主键索引和二级索引。

 

 

聚簇索引与非聚簇索引的特点:

  1. 聚簇索引的主键索引,数据行是和索引在一起的;

  2. 非聚簇索引的主键索引,数据行和索引分开存储,索引中保存数据行的地址;

  3. 聚簇索引的二级索引中,保存的是主键索引的值。之所以保存主键索引的值,而不是保存数据行的地址,是因为聚簇索引会发生页分裂,页分裂后数据存储的地址就会发生变化。当页地址发生变化后,只需要维护主键索引的数据即可,不需要维护二级索引,减少了索引的维护工作;

  4. 非聚簇索引的主键索引和二级索引没有什么实质性的区别。

聚簇索引有些优点:

  1. 可以把相关的数据保存在一起。比如一个用户的流水记录,按照用户的ID建立聚簇索引,这样用户所有的数据都会聚集在一起,因此查询时只需要读少数几个磁盘的数据块就可以获取一个用户所有的数据。
  2. 数据访问更快。聚簇索引的数据行与索引在一起,因此在聚簇索引上搜索时,完成索引的搜索就找到了数据,不需要再进行一次磁盘IO。
  3. 使用覆盖索引时可以直接使用页子节点中的主键值,因为二级索引的叶子节点上保存是主键值。

聚簇索引有些缺点:

  1. 插入的速度严重依赖于插入的顺序。如果按照主键的顺序进行插入,插入可以很快。如果不按照主键的顺序进行插入,则可能产生页分裂。页分裂不仅影响插入的速度,而且原来一个页,现在分成两个页来存储,而两个页又没有都存满,占用了更多的磁盘空间。所以这就是为什么DBA总是建议在使用InnoDB引擎时,使用自增ID做主键;
  2. 更新聚簇索引的代价很高,因为每个被更新的行会被移动到新的位置;
  3. 二级索引需要两次查找,因为二级索引中存放的是主键的值,需要再进行一次回表操作;
  4. 二级索引中存储主键的值,可能会导致二级索引占用更大的空间

事实上,InnoDB索引模型是MySQL索引中非常重要的一个索引模型,能够有效地帮助我们理解MySQL数据库的索引方式和原理。在动力节点在线网站上对于MySQL索引的整个知识体系有很透彻的解析,要学习的小伙伴千万不要错过,免费学习的机会就在眼前。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵279
程序员代码小兵279

75篇文章贡献270037字

作者相关文章更多>

推荐相关文章更多>

RabbitMQ使用及工作原理

代码小兵86504-19 19:55

Nginx反向代理的简单实例

代码小兵49806-21 15:40

Linux删除文件夹命令

代码小兵69607-21 11:32

Nginx配置详解

代码小兵12407-22 10:47

Linux更改ip地址的三种方式

代码小兵87207-21 12:51

发评论

举报

0/150

取消