视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

最全MySQL索引与底层实现原理详解

  • 课程笔记
  • 问答交流

索引是MySQL中比较重点的知识,尤其是在面试中出现的频率特别高,基本属于必问必考的环节。

为了助大家掌握好MySQL索引,这节课我会重点讲解以下6点:

1.MySQL索引原理

2.MySQL索引类别

3.MySQL索引数据结构

4.MySQL B+树索引实现

5.MySQL 聚集索引和非聚集索引

6.MySQL MyISAM与InnoDB的索引实现

以上内容这节课都会讲到,我先从MySQL索引的原理讲起。

MySQL索引原理

最全MySQL索引与底层实现原理详解-mikechen

 

评论交流
  1. mikechen

    good ✗咧嘴笑✗

    这里的B+树在MySQL存储引擎的实现一定要理解透彻,这个点太喜欢问了。

    剩余的部分大部分都是属于性能优化的范畴了:性能监控、表、索引等等这些点我下周会重点来讲解。

    继续一起加油,努力往前冲 ✗肌肉✗ ✗拳头✗

  2. 李鸿翼

    1.你现在线上的MySQL数据库是哪个版本?什么存储引擎?
    5.6 innodb

    2.该版本的索引的底层采用的是什么数据结构?(这里回答不上来就pass了,重点是想聊下面的B+树)
    b+树

    3.那么你知道为什么采用B+ 树吗?
    我们知道数据库索引的目的是为了提升查询数据效率,查找数据,最简单是顺序查找,但时间查询复杂度最差是O(N),常见优化方法时二分查找,所以基于二叉树存储的二分查找是比较合适,但二叉树带来一个问题,如果数据量比较大的情况,会导致深度很深,会增加IO次数,因此,我们可以采用B树/B+树来优化。同时,B+树相比B树做了一个改造,所有叶子节点存储数据,并通过链表连接起来。这样做范围查询的时候, 就不用像B树一样,可能还需要跨层。

    4.B+树和Hash索引比较起来有什么优缺点吗?
    hash索引读取单条数据很快,时间复杂度是o(1), 而B+树是o(log2n)
    但是B+树,由于底层叶子节点是链表连起来的,做范围查询很快。而hash这种结构因为无序性就无能为力了。

    5.最后,谈谈最左前缀匹配?

    我们在设计索引的过程中,不可能为每一种业务查询都设计一个索引,所以我们会考虑联合索引。
    联合索引在底层存储是按照索引定义顺序来存储,并且是排好序的。
    基于这个结构,我们既可以基于联合索引做左N个字段,也可以根据字符串最左N个字符串来查询,
    这样都是可以用的上索引的。

  3. 路正银

    1.你现在线上的MySQL数据库是哪个版本?什么存储引擎?
    5.6 InnoDB

    2.该版本的索引的底层采用的是什么数据结构?(这里回答不上来就pass了,重点是想聊下面的B+树)
    B+树

    3.那么你知道为什么采用B+树吗?
    B+树更为矮胖,可以减少磁盘I/O的次数(查找次数等于树的深度),而磁盘I/O是最大的时间开销
    B+树所有数据都在叶子节点,由于有链表结构(叶子节点从小到大顺序两两相连),只需要找到首尾,通过链表就能把所有数据取出来,在做范围查找的时候效率更高

    4.B+树和Hash索引比较起来有什么优缺点吗?
    Hash索引在不存在hash碰撞的情况下,只需一次读取,查询复杂度为O(1),比B+数快
    Hash索引是无序的,只适用于等值查询,而不能用于范围查询,也不具备排序性。根据hash索引查询出来的数据,还要再次进行排序
    B+树索引的复杂度等于树的高度,一般为3-5次IO。B+树子节点上的数据是排过序的,可以用于范围查找
    数据库的多列索引中,只能用B+数索引

    5.最后,谈谈最左前缀匹配?
    在创建多列索引时,根据业务需求,where子句使用最频繁的一列放到最左边,因为mysql索引查询会遵循最左前缀匹配的原则,在检索数据时从联合索引的最左边开始匹配。当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1),(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

    • mikechen

      Good ✗咧嘴笑✗ 索引的部分我下周会重点来讲解,这里如果还有兴趣还可以再多了解下B+树、B树等