美文网首页
61 mysql索引底层实现

61 mysql索引底层实现

作者: 滔滔逐浪 | 来源:发表于2020-10-14 10:02 被阅读0次

    Mysql性能优化原理

    1.MySQL索引数据结构类型有那些?
    hash B+树
    2.Hash索引、二叉树、平衡二叉树/红黑树、B+树之间的区别
    3.索引如何支持千万级表结构的快速查询?
    4.为什么最终MySQL索引选择B+树?
    1,支持范围查询
    2, 降低树的高度,减少磁盘io的次数。

    5.MyISAM与InnoDb引擎B+树索引底层原理
    6.缓存页与B+数索引之间的关系

    1,索引如何支持千万级表结构的快速查询?
    假设使用B+树存放元素,做一次磁盘io的操作 查询16kb 假设主键整数类型为8个字节,指针大小占用6个字节
    每个节点存放索引102416/14=1170个索引元素 11701170=1368900*16 20000000左右,树的高度为3.

    mysql 服务器读取硬盘数据是以页为单位 16kb 读取硬盘中数据到缓存区内存中。
    数据存放在硬盘中: 硬盘io操作。
    如何减少磁盘io操作。

    Mysql 索引底层实现原理:
    Mysql官方定义索引: 索引(index)是帮助Mysql高效获取数据的数据结构类似于书的目录结构一样。

    mysql索引结构: hash索引, 二叉树,平面二叉树/红黑树 b树 B+树。

    1 使用hash索引类似于 hashmap key 计算index
    优点: 等值查询的时候效率非常高
    缺点: hash算法 数据存放散列 不支持范围查询。
    2,使用二叉树

    特性: 左子树和右子树 根节点
    左子树根节点值要小
    右子树根节点值要大。
    缺点: 斜树 形成链表的结构。

    为什么二叉树 形成链表: 如果首节点值比较小的情况下,在做自增的时候形成链表不平衡。

    3 平衡二叉树 avl/红黑树:
    他是一颗空树或他的左右2个子树的高度差的绝对值不超过1
    使用旋转+变色 保证左右2个子节点的高度差不超过1

    缺点: 随着数据量增多,树的高度越来越高,做磁盘io操作次数越多,效率非常低。
    原因
    MySQL数据库结构模拟图
    https://www.cs.usfca.edu/~galles/visualization/BST.html
    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

    4,B树, 缺点: 数据冗余 叶子节点存放索引和data 数据
    叶子节点存放索引和data数据,每个节点缓存索引不会太多。

    5 b+树 mysql 索引底层实现原理
    分成叶子节点和非叶子节点
    叶子节点存放在索引和data数据
    非叶子节点不存放data数据,只存放索引。
    索引和data数据分开
    按照页读取范围更大
    索引如何支持千万级查询?
    1,mysql 底层使用 页为单位读取16kb
    2,做第一次磁盘io操作的时候 读取16kb 的索引内容
    3,一个索引值bigint类型8个字节 ,指针6个字节 14个字节。
    4 161024/14=1170 个索引, 11701170=1368900
    5, 分析 b+树高度为3的情况 假设叶子节点 每一行数据1kb。
    1368900*16=2000万

    image.png

    MyISAM与 Innodb 如何使用b+ 树
    MyISAM
    1 MyISAM基于b+树实现,索引的文件和物理数据分开。
    2 MyISAM 底层基于 叶子 data数据 通过指针指向 myd数据文件对应行
    Innodb:
    1,Innodb 索引的文件和物理数据没有分开
    2,Innodb叶子节点data数据存放对应行数据。
    3 Innodb 非主键索引叶子节点data 主键id ,需要查询2次
    先查询非主键索引的文件,得到主键id,在根据主键id查询主键索引的结构。
    得到整行的数据。

    存储引擎和表有关系。
    为什么 Innodb 引擎表必须有主键 并且推荐使用整型的自增方式?
    1,主键id 不要使用UUID、 不支持范围查询
    2, 无法实现比较 其次比较占用内存。
    3,建议主键id采用整数类型自增。

    相关文章

      网友评论

          本文标题:61 mysql索引底层实现

          本文链接:https://www.haomeiwen.com/subject/kppipktx.html