mysql 索引(为什么选择B+ Tree?)

索引实现原理

索引:排好序数据结构
优点:降低I/O成本,CPU的资源消耗(数据持久化在磁盘中,每次查询都得与磁盘交互)
缺点:更新表效率变慢,(更新表数据,还要更新索引),占用空间
分类:主键索引,唯一索引,单值索引,组合索引

索引的数据结构

Hash表(舍弃:不适合范围查找和排序)

hash 是一维数组 + 二维链表:取模后进行存储

对于hash算法的CRUD来讲,时间复杂度为O(1)
但对于范围查询和排序来讲,时间复杂度又从最好变为O(n)

在这里插入图片描述

二叉树(舍弃:自增序列无效)

理想情况
在这里插入图片描述

mysql不使用的原因:对于自增数据,树左倾或右倾形成链表,时间复杂度变回了O(n)
在这里插入图片描述

红黑树(舍弃:树会很高)

本质就是二叉树,相比较于二叉树,他有平衡功能(当一边高时,会自动更新根节点),又称为二叉平衡树
在这里插入图片描述

mysql 不使用原因:数据量大的时候,树会更高,查找到叶子节点效率也会慢,每层就是一次IO

B Tree(舍弃:每个节点存放数据,可以优化)

特点:在每个节点,放多个索引
优点:树就不会高,但每个节点都会存data数据,会占据很大的磁盘空间
在这里插入图片描述

B+ Tree(mysql默认)

优点:
1.非叶子节点不储data,只存储索引,可以放更多的索引
2.叶子节点包含所有索引+data字段,由双向链表排成一行(更好的实现范围查找和排序)
3.叶子节点用指针连接,提高区间访问的性能

mysql 默认每个节点为16KB,
例如:若使用bigInt的主键,每个节点大概可放1170 个索引,若树高3层,则为1170*1170 *16 约为2000多万索引

在这里插入图片描述

总结:(数据存叶子节点,双向链表)

BTree 和B+Tree都是多路搜索树,区别在于叶子节点和非叶子节点的处理。
1.BTree 每个节点都储存索引+数据,B+Tree 的非叶子节点只存储索引+指向叶子节点的指针,数据存到叶子节点,这样B+Tree 的非叶子节点就可以放更多的索引,树的层级也就降低了,这样查找更快,减少了磁盘IO
2.B+Tree 的叶子节点都有指针相连接,形成双向链接表,这样在范围和排序时更快,而BTree 的叶子节点没有相连接,范围查找时还得向父节点查找。所以B+Tree 的范围查找和排序更好

数据结构训练网址

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据的响应式:实现动态数据驱动的技巧

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

洛谷P1100 高低位交换

#先看题目 题目描述 给出一个小于 的非负整数。这个数可以用一个 32 位的二进制数表示(不足 32 位用 0 补足)。我们称这个二进制数的前 16 位为“高位”,后 16 位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这…

​关于robotframework,app,appium的xpath定位问题及常用方法​

关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法。还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在id或者name。可能没有看到na…

UI 学习 三 可访问性 UX

设计、交流和实现不同领域内容的易访问性决策,涉及到一系列考虑因素,以达到更容易访问的产品体验。 Material使用的框架借鉴了WCAG标准和行业最佳实践,以帮助任何人预测、计划、记录和实现可访问体验。 下面描述的三个阶段有助于将可视化UI…

Verilog——信号类型

Verilog HDL 的信号类型有很多种,主要包括两种数据类型:线网类型 (net type) 和寄存器类型 ( reg type )。在进行工程设计的过程中也只会使用到这两个类型的信号。 4.1 信号位宽 定义信号类型的同时,必须定义好信号…

使用决策树模型绘制混淆矩阵、ROC曲线、特征变量重要性排序图

大家好,我是带我去滑雪! 决策树模型可以处理各种类型的特征(连续型、离散型、类别型等),不需要对特征进行过多的预处理工作,因此非常适合初步探索数据。通过绘制混淆矩阵、ROC曲线和特征变量重要性排序图&a…

基于java+springboot+vue实现的高校自习室预约系统(文末源码+Lw+ppt)23-428

摘 要 高校自习室预约系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和学生来对系统进行设计构建。主要功能包括:个人信息修改,对用户…

DNA序列修正——HashMap应用

题目链接:1.DNA序列修正 - 蓝桥云课 (lanqiao.cn) 利用HashMap的特性,将字母匹配转换成数字匹配 A T 0 1 C G 1 2 3 另外,Java中没有交换(swap)函数,需要自己进行编写。 程序代码: pac…

【电路笔记】-MOSFET作为开关

MOSFET 作为开关 文章目录 MOSFET 作为开关1、概述2、MOSFET特性曲线2.1 截住区域2.2 饱和区域3、MOSFET作为开关的示例4、功率MOSFET电机控制5、P沟道MOSFET作为开关6、互补MOSFET作为开关电机控制器当 MOSFET 在截止区和饱和区之间工作时,MOSFET 是非常好的电子开关,用于控…

mybatis项目中配置sql提示

2023版的idea好像内置了这个功能。 第一步: 第二步:第一步完成后user会爆红,这时我们需要连接数据库。

TypeScript中的 K、T 、V

文章目录 前言泛型类型链接关系K、T、V 含义自动类型推断泛型的应用场景容器类和数据结构函数和方法接口和类类型约束和扩展常用的工具类型 前言 在 TypeScript 的泛型里经常会碰到一些字母,比如 K、T、V,是不是觉得很奇怪? 泛型类型 图中的…

ChatGPT提示词方法的原理

关于提示词,我之前的一些文章可以参考: 【AIGC】AI作图最全提示词prompt集合(收藏级)https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

力扣● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

● 583. 两个字符串的删除操作 注意审题: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 删除最少的字符使两者相同,说明留下来的就是最大公共子序列。不要求…

13 秒插入 30 万条数据,这才是 Java 批量插入正确的姿势!

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

代码资源集合

代码资源 通信QPSKOQPSKMSK信道编码GMSK 雷达LFM及干扰技术LFM射频噪声干扰噪声调幅干扰噪声调频干扰噪声调相干扰固定移频干扰间歇采样干扰 SAR成像RD算法CS算法wk算法 SAR干扰技术射频噪声干扰调幅噪声干扰调频噪声干扰调相噪声干扰噪声卷积干扰乘积干扰移频干扰 DOA估计功率…

电学基础知识

目录 电流 前言 电流的产生 电流的单位安培(A) 电路和电池 开路和闭路 电灯泡原理 对电池容量的理解 毫安时 毫瓦时 直流电和交流电 AC交流电 DC直流电 直流电和交流电对比 电压 对电器的电压和电流的理解 电阻 电压电阻电子的关系 欧…

python--剑指offer--中等--07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树: 3/ 9 20 / 15 7 …

47.全排列II

// 定义一个Solution类&#xff0c;用于解决给定不重复整数数组的全排列问题 class Solution {// 初始化结果集&#xff0c;用于存放所有不重复的全排列组合List<List<Integer>> result new ArrayList<>();// 初始化路径变量&#xff0c;用于暂存当前递归生…

Vulnhub靶机:Kioptrix_Level1.3

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Kioptrix_Level1.3&#xff08;192.168.56.109&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vul…

2024.3.18

1、试编程 封装一个动物的基类&#xff0c;类中有私有成员:姓名&#xff0c;颜色&#xff0c;指针成员年纪再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有:指针成员:腿的个数(整型intcount)&#xff0c;共有成员函数:会叫:void speak() 要求…