视频合集

    最全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树等

    欢迎您,新朋友,感谢参与互动!