innodb索引之聚簇索引和二级索引(辅助索引、非聚簇索引)学习总结

inoodb 是使用b+树来实现索引功能的。

一、 B+树和B树的区别

  1. B树种的同一键不会出现多次,可能在叶子节点上也可能在非叶子节点上;
    b+树的键一定会出现在叶子节点上,同时也可能在非叶子节点上重复出现。
    简单的说,b+树的非叶子节点存储的都是键值,键值对应的具体数据都存储在叶子节点上。
  2. b数据的每个节点存储的是真是数据,会导致每个节点的存储的数据量变小,所以整个b树的高度会相对变高。随着数据量的变大,维护代价也增加;
    b+树的非叶子节点只存储的是键值,相对而言,一个非叶子节点存储的记录个数要比b树多的多。 b+树是横向扩展,随着数据增加,会变成一个矮胖子,b树是纵向扩展,最终树的高度越来越高(高瘦子)。
  3. b树的查询效率与键在b树的位置有关系,在叶子及诶单的时候最大复杂度与b+树相同;b+树复杂度对某个建成的树是固定的。
  4. b树的键的位置不固定并且整个树结构中只出现一次,是的增删改查操作复杂度增加;b+树种,非叶子节点对于叶子节点来说就像一个索引,增删改的时候只要找到键值(索引)的位置,再一层层的向下找即可,只有在遇到一个节点存储满了会对b+树分裂。
  5. b树种所有的数据都只存储一份;b+树除存储了所有数据的叶子节点外,还有之存储键值数据的非叶子节点。所以,b+树比b树会多占存储空间,多占的空间就是b+树的非叶子节点的所有空间。

二、 索引设计

  1. 计算机运行一个任务涉及性能:
    1、内存大小
    2、cup运算速度
    3io速度

而索引是一种存储方式,与他有关的最终要的部分是磁盘,所以磁盘的性能直接影响数据在数据库的查询效率。索引的设计必须要尽可能地降低无效数据的读写访问。

  1. 关系型数据库的结构特点:
    1. 数据都是以行位单位存储的,一行中包括一个表(聚簇索引)或者一个索引(二级索引)中 定义的所有列,多行数据可以连续一起存储。
    2. 一行数据一般会有一个键,以及其他附属的列,称之为值,可以理解为一行数据就是就一个键值对。如果没有主键内部会加上一个rowid值得一个主键,默认主键,一样是一个键值对。
      3.在键值对中,键值可以排序还可以组合键值。b+数据中,非叶子节点存储了行数据中的键,二叶子节点存储了所有的行数据。通过非叶子节点的键值及一个位置信息,扉页纸节点与下层节点或叶子节点之间的指针,就可以找到其孩子节点。

三、 聚簇索引:

一个表可以建立多个索引,但每一个表都有一个存储所了有数据的索引。聚簇索引在每个表中只有一个,且是建立在主键上面的,这个主键包含的列可以是被隐藏的rowid列,也可以是自增列,还可以被明确定义为不含NULL值的组合列等。称为聚簇索引、聚集索引

四、 二级索引:

除了聚簇索引外的所有索引,称为二级索引、辅助索引。二级索引建立在经常使用的列上。在统计一个表总的精确行数 count(*),一些优化器就会选择表中最小的索引来作为统计目标索引,因为它占用空间最小,io也会最小。

*回表*

所谓回表就是在使用二级索引时,因为二级索引之存储了部分数据,如果根据键值查找到的数据不能包括全部目标数据,就需要二级索引指针,也就是键值对中的值,来找到聚簇索引的所有数据,然后根据完整的数据取出所需要列的过程。
覆盖索引不需要回表

innodb读操作:
通过二级索引查询记录仅能得到主键值,要查询完整的记录还需要再通过一次聚集索引查询,这种查询方式为书签查找(bookmark lookup)。
innodb写操作:
仅当主键发生改变时,才会更新二级索引.

innodb引擎是索引组织表,所有记录都放在聚集索引里,因此其辅助索引中的记录地址存放的主键的键值.
二级索引的非叶子节点存放的记录格式为<键值,主键值,地址>,二级索引的非叶子节点依然存在主键信息。二级索引节点的记录不保存隐藏列xid和roll ptr,这是二级索引和聚集索引的不同,
由于二级索引不包含记录的完整信息,在innodb存储引擎中二级索引的树高度比聚簇索引的树高度小,二级索引效率低。

本文章摘录自:《innodb存储引擎》、《运维内参》

    原文作者:柔于似水
    原文地址: https://blog.csdn.net/q936889811/article/details/79780307
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞