• 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是不能走索引的,因为左边的值是模糊的,是不能进行匹配

  • 相关阅读:
    宠物行业如何进行软文营销
    实战——Linux调优命令1
    python学习29:python中的字典dict
    Unity开发者必备的编辑器技巧
    java爬虫——HttpClient爬取jsoup解析
    MimicMotion - 一张图片实现视频跳舞,腾讯开源照片跳舞模型 本地一键整合包下载
    4款Windows上鲜为人知的黑马软件,内存不足也舍不得删除
    Unity Debug的简单封装
    【opencv】Opencv中数据类型CV_8U, CV_16U, CV_16S, CV_32F、CV_64F
    OpenCV杂记(2):图像拼接(hconcat, vconcat)
  • 原文地址:https://blog.csdn.net/l577125882/article/details/125594677