InnoDB聚集索引和辅助索引

  • InnoDB存储引擎有聚集索引和辅助索引,是索引组织表,按照主键的顺序存储数据。

聚集索引:

在这里插入图片描述

按照每张表的主键构建一棵B+树,叶节点中存放表的整行数据,叶节点成为数据页,每个数据页之间通过一个双向链表进行连接。数据页存放每行的所有记录,非数据页(非叶节点)存放键值和指向数据页的偏移量。一张表只能有一个聚集索引(因为只有一个主键PRIMARY KEY)
(1)可以在叶节点直接找到数据;
(2)对于主键的排序查找速度很快,因为聚集索引是逻辑上连续加粗样式的。比如查询后10条数据,由于B+树索引是双向链表,可以很快找到随后一个数据页,然后取出最后的10条数据
(3)对于主键的范围查找速度快,如果要查找主键某一范围的数据,通过叶子结点的上层中间节点就可以得到页的范围,之后直接读取数据页。

辅助索引:

按照每张表创建的索引列(非主键列的其他列,被搜索的列)创建一棵B+树,叶子节点并不包含行记录的所有数据,只包含键值和书签,书签用来告诉InnoDB存储引擎在哪里可以找到行数据,一张表可以有可以有多个辅助索引。要先在辅助索引中找到键值,再根据键值去聚集索引中找到整行数据。 例:执行一次查询就是一次IO,比如 辅助索引树高度为3,聚集索引树高度为2,则通过辅助索引查询数据时就要进行3+2次逻辑IO最终得到一个数据页

  • 例:
    如下是一张课程表cource(id, name, score):
    在这里插入图片描述
    主键是id,聚集索引创建的B+树:适合于:'select * from course where id=111
    叶节点保存整行数据,非叶节点只充当索引不存储数据。。
    在这里插入图片描述

select * from course where name="数据结构"利用非主键的其他字段进行查询,创建辅助索引的B+树,

辅助索引的叶子结点的值不是一条记录的完整数据,而是存的记录对应的主键值。在利用非主键的数据段进行查找时,首先通过数据结构在辅助索引中找到主键111,再去聚集索引中根据主键111查找到整行数据。

在这里插入图片描述

最左前缀原则

对于where a=x and b=y使用联合索引;对于where a=x使用联合索引;对于where b=y 不使用联合索引。可以对第二个键值进行排序,例如:查询用户的购物情况,并按照时间顺序排序,联合索引可以避免多一次排序操作。

覆盖索引

从辅助索引就可以查到整行数据,而不需要再去聚集索引中查找记录。
(1)辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以较少大量的IO操作
(2)做统计时,不会通过聚集索引来统计,通过辅助索引就可以实现统计,也减少了IO
利用上面创建的表和索引

附录:MyISAM存储引擎的索引

详细参考这篇博客:索引
索引文件和数据文件是分离的,索引文件的data域保存记录所在页的物理地址,通过地址来读取页,得到整行数据。而对于二级索引,在 MyISAM存储引擎中以与上图同样的方式实现,也就是主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

在这里插入图片描述

  • InnoDB存储引擎和MyISAM存储引擎索引上的区别
    (1)InnoDB存储引擎数据文件就是整行数据;MyISAM存储的索引文件和数据文件分开,只能通过索引文件中的地址去读取整行数据;
    (2)InnoDB存储引擎辅助索引data域存储相应记录的主键;MyISAM存储引擎主索引和辅助索引没什么区别,只是主索引要求key是唯一的,而辅助索引的key可以重复;

————————————————

参考:https://blog.csdn.net/weixin_42237937/article/details/104473495
参考:https://cloud.tencent.com/developer/article/1557085
参考:MySQL技术内幕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值