• Mysql(一) 索引底层数据结构


    Mysql(一) 索引底层数据结构

    先了解一下索引常用的数据结构

    http://www.rmboot.com/

    二叉搜索树

    优点:能够快速插入二分查找,时间复杂度是 O(logn)

    缺点:没有平衡能力,最差情况下可能会成单只树,这时候查找的时间复杂度是 O(n)

    请添加图片描述

    红黑树

    特点:是二叉平衡搜索树。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作

    请添加图片描述

    B树

    特点:查找树,每个节点节点可以有多个子树,中间节点和叶子节点的数据不会重复

    请添加图片描述

    B+树

    特点:查找树,每个节点节点可以有多个子树,叶子节点存储了全部数据,和中间节点的数据会有重复

    请添加图片描述

    索引

    了解下数据结构之后,我们再来思考以下问题

    • 什么是索引?
    • mysql为什么需要索引?它的数据是怎么存储的?
    • 为什么采用B+树作为索引的数据结构?

    简单来说,索引就是一种能够帮我们快速查找数据的数据结构,既然要快速查找,数据肯定要有序的存储和维护。

    现在有一张表,如果没有索引的情况下,我想查找id为6的数据,就需要遍历整张表才能拿到,但是如果对id建立索引,将每行数据作为一个节点存储在以上的数据结构中,那么使用二分查找就很快能找到对应的数据。

    请添加图片描述

    mysql的数据是存储在磁盘上的,如果我们要去查找数据,就需要用到磁盘IO,如果树的深度很大的话,每次IO消耗的时间是比较难受的,所以二叉树不适合作为索引的数据结构。

    innoDB存储引擎中数据是按照页存储的,页的大小默认是16kb,可以把一页作为树的一个节点。

    B树会在中间节点存储一行的全部数据,如果行的数据过多,就会导致每页存储的索引数据就会变少,树的深度也会响应增加,导致多余的磁盘IO

    b+树的优点:B+树的每个节点可以表示的信息更多,充分利用数据页存储索引数据,可以减少磁盘 IO 的次数,从而提升查找速度,行数据全部存放在叶子节点中,而叶子节点中有一个指针指向一下个叶子节点(双向指针)。这样可以提高区间访问的性能(范围查询)。

    聚簇索引和非聚簇索引

    聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

    非聚簇索引就是相对聚簇索引而言的,这种索引的树叶子节点不存储数据存储的是数据行地址,也就是说我们根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类型一本树的目录,比如我们要找第三章第一节,那我们先再这个目录里面找,找到对于的页码后再去对应的页码 。

    最左前缀原则

    树的目录,比如我们要找第三章第一节,那我们先再这个目录里面找,找到对于的页码后再去对应的页码 。

    最左前缀原则

    因为索引是排好序的,当我们创建联合索引,或者使用 like的‘…%.’的时候,可以进行从左往右匹配。特别注意的是,当我们创建联合索引,a,b,c 三个字段。如果只使用b,c是不能走索引的,因为左边的值是模糊的,是不能进行匹配

  • 相关阅读:
    基于Java+SpringBoot+MyBatis+Vue前后端分离宠物领养设计与实现
    功能测试必备:Fiddler 抓取 HTTPS 请求
    VMware vSphere 虚拟交换机绑定和故障切换策略
    【Java学习笔记(一百二十七)】面向对象(二)之封装、继承、多态
    VUE、.NET多文件的上传、接收
    docker 开启 tcp 端口
    C++总结(8):STL容器适配器之stack、queue、priority_queue详解
    安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决
    PE文件的导入表,动态链接库中的函数应该如何导入
    内网穿透 | 推荐两个免费的内网穿透工具
  • 原文地址:https://blog.csdn.net/l577125882/article/details/125594677