MySQL索引结构学习笔记

本文结合存储引擎对MySQL索引结构做一个专门的总结

一句话总结选择合适的引擎:除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎 

一句话概括索引:索引是帮助MySQL高效获取数据的【排好序】的【数据结构】        --MySQL官方

1. Btree中每个结点存储了key和data,而B+tree中只有叶子结点存储data,中间结点不存储data,只存储索引(冗余),所以B+tree的中间结点可以存储更多的索引(补充一个概念:B+tree中的一个结点叫做一个page)

2. MySQL数据库中的存储结构都是B+tree,不同的是如果叶子结点中的data存放的是【实际数据本身】,则这种结构叫做【聚簇索引】,这是InnoDB存储引擎使用的存储结构;如果data中存放的是【数据地址】,则这种结构叫做【非聚簇索引】,这是MyISAM存储引擎所使用的数据结构

3. MySQL中的索引除了B+tree之外其实还有hash索引,但是实际开发中99%使用的都是B+tree,hash可以帮助我们快速定位到某一条数据,因此在判断等于或者不等于时特别高效,但它的致命问题是无法解决范围查询,而B+tree可以很好地处理范围查询。B+tree的叶子结点有两个【指针】,一个指向前面的叶子结点,一个指向后面的叶子结点(这个结构看起来很像一个双向链表,并且是一个【排好序】的双向链表),这样一来范围查询就非常快,比如我们要查询>50的数据,只要我们定位到了50,随后将存放在50右边的数据直接全部读出来即可,不用做额外的判断。(注意Btree叶子结点之间是没有指针的)

为什么InnoDB要求我们在设计表的时候:1.自己设计主键;2.使用整型类型做主键;3.整型主键最好设计成自增的?

1. InnoDB存储引擎采用的是【聚簇索引】结构,即数据本身就是以一个B+tree的形式存放的,如果我们自己不设计主键索引,MySQL自己也会为我们找到一个可以作为主键的列(即没有重复数据的列),来作为索引值构建B+tree,如果找不到,则添加一个隐藏列,在隐藏列中添加独一无二的数据信息,作为索引来构建B+tree;

2. 整数比较起来速度更快,效率更高;

3. 需要自增是因为自增可以保证按顺序插入,这样可以减少B+tree进行结点的分裂和平衡操作。试想一下,如果当前叶子结点保存的是5和7,结点中保存的最大数据个数为3(小于3),这个时候我们想要插入6,则必须破坏当前叶子结点的结构,连带着其中间结点的结构也会产生一系列的分裂和平衡操作,才能保证B+tree的结构不被破坏。

聚簇索引与非聚簇索引 

  • 聚簇索引(InnoDB)

  • 非聚簇索引(MyISAM)

覆盖索引

先来看看InnoDB和MyISAM的主索引与辅助索引结构之间的一些区别

  • MyISAM

  • InnoDB

与MyISAM索引的不同是,InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。因此在InnoDB中可以实现一个特别的概念——覆盖索引

一个联合索引对于某个select语句,通过索引可以直接获取查询结果,而不再需要回表查询,就称该联合索引覆盖了这条select语句

 如上图InnoDB索引结构所示,如果我们只需要查询姓名和编号,即在Secondary Key中我们就能直接找到我们想要的所有结果,而无需回表到Primary Key去继续查询,这就实现了索引覆盖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值