首页 > 数据库 >Mysql之数据结构

Mysql之数据结构

时间:2022-10-23 11:45:51浏览次数:46  
标签:hash Tree 叶子 索引 Mysql 数据结构 数据 节点

1.Hash

哈希表是键值对的集合,通过键(key)值即可快速的取出对应的值(value),因此hash表查询的速度很快。但是,哈希算法有hash冲突的问题,也就是说多个不同的key最后得到的index相同,虽然hash通过链表的方法解决了hash冲突,但是如果使用hash用来存储数据,mysql可能会将每一行数据都存储在hash表中,这样数据都会通过hash表来维护,如果数据库操作数据量特别庞大,添加数据的时候会增加hash冲突次数。这是原因之一。
还有一个原因是因为hash不支持顺序查找,假如我们要对表中的数据进行排序和范围搜索,hash实现起来会很麻烦。虽然这种数据结构查询快,但是没有数据大小的概念,所以这种数据结构仅能满足 “=”,“IN”,范围查询会导致全表扫描,所以也应用较少。
由于Mysql的B+Tree叶子节点有双向指针,并且是顺序排列的,就可以很好的支持范围查找。

2.二叉树

二叉树的每一个节点都只有两个子节点,当需要向其插入更多的数据的时候,就必须要增加树的高度,而增加树的高度会导致IO的次数变多,对于二叉树而言,它的查找操作的时间复杂度就是树的高度,树的高度越高查询性能会随着数据的增多越来越低。
二叉树节点中,右边的节点一定会大于左边的节点。如果是非正常的倾斜(比如id是自增的情况)的二叉树,查询一次数据就相当于与全表搜索。

二叉树图:

极端单边增长的值在二叉树中和链表:

3.红黑树

红黑树是一个二叉平衡树。平衡树在插入和删除的时候,会通过旋转操作将树的左右节点达到平衡。红黑树的特性导致从根节点到叶子节点的最长路径不会超过最短路径的2倍。在实际场景应用当中,MySQL表数据,一般情况下都是比较庞大、海量的。如果使用红黑树,树的高度会特别高,红黑树虽说查询效率很高。但是在海量数据的情况下,树的高度并不可控,而且红黑树也需要不断的调整平衡性,也需要消耗性能。如果我们要查询的数据,正好在树的叶子节点。那查询会非常慢。

树结构:

 4.B-Tree

B树的叶子结点具有相同的深度。所有索引元素不重复,节点中的数据索引从左到右递增排列。
那么为什么不选择B-tree呢?

B树的索引节点既要存索引信息,又要存其对应的数据,每个节点一次I/O操作就可以完全载入,这样能大大提高对数据读取的效率。但是如果数据很大,那么当树的体量很大时,节点上的数据会超过磁盘块大小范围。但是B树的高度是根据索引的大小决定的,比如一个叶子节点的大小是16Kb,一个索引元素按照1kb(比如一个表有二十个字段,每个字段都是bigint占用8个字节,可以算出,一行数据应该不会超出1KB,这是一个预估值《按照平均1kb计算》),一个叶子节点只能存16个索引元素,如果要查找千万级的数据,需要16 的N次方=一千万才能查到数据,N就是查找的索引次数。

 5.B+Tree

B+Tree和B-Tree的差距在于B+Tree的分支节点只存储索引信息,把数据都放在叶子节点上(非叶子节点是冗余节点,取得是叶子节点在磁盘节点上某些部分的索引),而且叶子节点包含了书中所有的索引结构,从左到右有序的递增的,这样保证了相近的数据都能存在同一块数据块里。叶子节点的每一页都包含了上一页和下一页的内存地址的指针索引,因此B+树具备了天然排序功能,在排序和范围查找的时候更方便。

同时B+树的查询次数更稳定,每次查询次数都是相同的,都需要查询到叶子节点。比如:在mysql中B+Tree默认的磁盘页节点大小是16KB,假设索引(主键索引)是bigint类型的,那么他会占8个字节,加上叶子结点的磁盘文件地址6个字节,节点索引大小大概是14tb,那么每一个索引行(页)就可以存储1170个索引元素,加入第三行存的是叶子节点,因为节点中包含所有数据信息(假设是整行数据,大小算1kb《比如一个表有二十个字段,每个字段都是bigint占用8个字节,可以算出,一行数据应该不会超出1KB,这是一个预估值》),那么b+tree树只需要三行就可以存放1170×1170×16=21,902,400 个索引元素了。所以B+Tree只需要三次的磁盘io就可以找到需要查找的元素了。也就说千万级的数据(走索引的情况)查找只需要经过三级就可以快速的查找到需要的元素了。

6.B-Tree和B+Tree

b+树只需要三级既可以存储千万级别的数据索引了,而b-树需要是根据索引的索引元素大小来构建索引节点的,数据量较大的时候,b+树io次数更少。
b+树只有的叶子才会存储数据,b-树所有索引节点都会存储数据。
b+树所有查询都要查找到叶子节点,查询性能稳定。
b+树所有叶子节点在这里插入图片描述
形成有序链表,便于范围查询。 

标签:hash,Tree,叶子,索引,Mysql,数据结构,数据,节点
From: https://www.cnblogs.com/qiulong/p/16776973.html

相关文章

  • 记录安装mysql中的一些坑
    5.6版本一下,初始化。不要加参数--initinizie进入后可以直接进行修改密码。第二注意client和mysqld的sock文件必须指定同一个文件夹。第一步下载mysql安装包第二步解压......
  • (转)MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS
    原文地址:https://www.cnblogs.com/miracle-luna/p/14760051.html 在MySQL中创建函数时,报错如下:ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATA......
  • 数据结构 玩转数据结构 3-4 关于Leetcode的更多说明
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13421 1重点关注1.1学习方法论1      自己花费了很多力气也解决不了的问......
  • android连接mysql
    导入Mysql的jar,和rxjavaimplementation"io.reactivex.rxjava2:rxjava:2.2.10"implementation"io.reactivex.rxjava2:rxandroid:2.0.2" 创建DBOpenHelper......
  • 数据结构必背代码
    1.二叉树的三种非递归voidPreorderWithOutRecursion(BiTreeb){BiTNode*p;SqStackst;InitStack(st);p=b;while(!StackEmpty(st)||p!=NULL){......
  • docker部署mysql8.0
    linux环境下基于docker部署并配置mysql8.0环境docker-18.06.0192.168.12.220002主192.168.12.320004从1.#下载mysql的版本dockerpullmysql:8.0.222.#创......
  • 数据结构栈与队列学习以及刷题总结
    1.栈与队列基本内容(1).栈:栈是一种线性结构,限定仅在表尾进行插入和删除操作的线性表。通过学习栈的性质,我们可以将其形象的想成叠盘子,每一个元素压入栈时都会成为栈顶元......
  • mysql(分页表,日期.表连接,事务,索引,视图,备份)
    1.分页:limirm,n(一般放最后,其次在排序)m:表示从第几条数据开始显示(0表示第一天数据)n:表示每页显示的数据条数公式m=(pageNo-1)*pangeSizepageNo:表示显示的第......
  • SpringBoot 创建项目连接mysql数据库
    Spring 创建项目1.创建一个springboot项目2.点击File---- New---- project项目名称可以随便填写...3. Springboot版本尽量不要最新版,怕你们驾驭不了......
  • mysql主从复制
    配置主库Master1.修改mysql配置文件/etc/my.cnf[mysqld]log-bin=mysql-bin#启动二进制文件server-id=100#服务器唯一id2.重启MySQL服务systemctlrestartmysqld......