【mysql】关于mysql的数据结构特点 索引特点

文章目录

  • 二叉树
    • 红黑树
  • b tree
  • hash结构
  • b+ tree
    • 索引存放特点
      • myisam
      • InnoDB
  • 最左原则
  • 主键相关知识点
  • 缓存池
    • 淘汰机制

前言:翻自己博客 发现缺少mysql数据结构和索引相关内容
两年前整理的mysql知识点 一直存在于博主的笔记本里面
(是的 纸质的那种笔记本 不是程序员吃饭用的笔记本)

二叉树

二叉树特点 小数在左 大数在右

如下图 (鼠标不太方便画图 将就着看吧 能看懂就行):

在这里插入图片描述

当数据不规律的时候 二叉树就会变化成链表 ,所以MySQL放弃二叉树

如下图 : (具体的数字单纯是博主方便鼠标好画 随意举例的)
在这里插入图片描述

红黑树

红黑树也叫平衡二叉树,会自动旋转

在这里插入图片描述
那既然会自动旋转了,解决了变成链表的问题 会不会有其它问题呢?答案是肯定的,当数据量大的时候,树的高度就会增加,如下图:
在这里插入图片描述

b tree

既然红黑树会有高度的问题,那么 b tree就在优化这个问题:

btree在红黑树的基础上,有了更多的根节点,降低了树的高度,从而降低了磁盘访问次数。
当然 根节点是完全可能因为数据的变化而变化的

这也是博主自认为最通俗的理解了,我们可以借助工具网站来观察:
在这里插入图片描述

hash结构

在介绍b+tree之前 我们也简单提一下hash结构,当前mysql版本两大结构就是hash和b+tree了。

hash结构拥有快速的插入和查找速度,但是由于hash的无序性,它并不适合范围查找。

hash结构的主要两大缺点:

  1. 不支持范围查找
  2. 极小概率hash冲突

b+ tree

b+tree在btree的基础上,子节点之间都有指针连接,且子节点是个有序链表,更适合作为数据库索引的结构,更利于查询,自然也更好的支持范围查找。

在这里插入图片描述

索引存放特点

安装过mysql的同学应该都知道 会有一个data文件夹,data文件夹即存放我们的数据

myisam

(data文件夹下)
存放着三种格式的文件,它们分别存放的内容:

.frm文件: 表结构
(这些文件存储表的定义信息,包括列名、数据类型等表结构相关信息。)

.MYD文件:表数据
( 这些文件是MyISAM表的数据文件,存储着实际的行记录和数据内容。)

.MYI文件: 表索引
(这些文件是MyISAM表的索引文件,存储了表的索引信息)

MYI文件的索引其实就是指向数据真实地址的指针
在这里插入图片描述

聚集索引:叶节点包含了完整的数据记录

myisam是非聚集索引(表数据和索引分开存放) 是回表查询,即通过索引,再去.MYD文件中查找数据。

InnoDB

(data文件夹下)
存放着两种格式的文件,它们分别存放的内容:

.frm文件: 表结构
(和myisam一样这些文件存储表的定义信息,包括列名、数据类型等表结构相关信息。)

.idb文件 表数据,表索引
(InnoDB存储引擎的数据和索引都存储在共享的数据文件中,通常以.ibd文件的形式存在。.ibd文件包含了表的实际数据以及与之相关的索引信息。)

innoDB是聚集索引
但在它的二级索引(主键之外的索引)查询操作时,会先查找所在的主键,通过主键再去查找具体数据,也是回表查询。

最左原则

联合主键和模糊查询 都遵循最左前缀原则。

在联合主键中,如果由多个列组合而成,那么查询或者排序时会按照主键中列的顺序从左至右依次进行。也就是说,查询或者排序的效率会受到最左边的列的影响,后面的列则会在前面列的基础上进行进一步的筛选。

例如 t 表中,c1 ,c2是联合索引:

select c1 ,c2 from t where c1 = 1; 这是正确的使用姿势

在模糊查询中,最左原则同样适用,例如 like ‘xx%’ 是可以有效利用索引的 俗称走索引, like '%xx’则不能。

主键相关知识点

  1. 主键推荐用整型,因为b+tree要比较大小,整型比较快
  2. 自增id效率是最高的

那为什么很多项目不用自增id呢? 自增id两大致命缺点:

  1. 不适合分表(分布式系统中不适用)
  2. 很容易被猜到相邻数据 (数据隔离问题)

所以一般都是使用雪花算法,而雪花算法常见的(面试)问题就是时钟回溯,正常发生时钟回溯的概率 是可以忽略不计的,百度的算法是直接抛异常 人工处理,美团有解决方案。

缓存池

InnoDB缓冲池: InnoDB存储引擎使用缓冲池来缓存数据页和索引页,以加快对数据的访问速度。通过在内存中缓存热门数据,可以减少对物理存储设备的访问次数,从而提高系统的性能和响应速度。

淘汰机制

LRU算法:
InnoDB缓冲池会根据LRU(最近最少使用)算法来管理缓存的数据页,确保内存中始终缓存最常访问的数据。

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

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

相关文章

JVM八股文

1.JVM的内存结构? 2.OOM是什么,怎么排查? 3.请解释四种引用是什么意思有什么区别? 4.GC的回收算法有哪些? 5.怎么判断对象是否存活? 1.什么是JVM内存结构 jvm将虚拟机分为5大区域,程序计数器、…

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采,预计将采购国产5G手机120万台,加上另外两家运营商的集采数量,估计集采数量可能达到300万部,如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市,获益…

PostgreSQL性能调优:优化查询和索引设计

随着数据量的增长和业务需求的变化,数据库性能成为了许多企业关注的焦点之一。在众多的数据库管理系统中,PostgreSQL因其稳定性和可靠性而备受青睐。然而,即使是最强大的系统也需要合适的调优,以确保其能够高效地处理大规模数据和…

微服务拆分的思考

一、前言 前面几篇文章介绍了微服务核心的两个组件:注册中心和网关,今天我们来思考一下微服务如何拆分,微服务拆分难度在于粒度和层次,粒度太大拆分的意义不大,粒度太小开发、调试、运维会有很多坑。 二、微服务划分…

Windows:Arduino IDE 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 参考官网:Arduino - Home Arduino是一款简单易学且功能丰富的开源平台,包含硬件部分(各种型号的Arduino开发板)和软件部分(Arduino IDE)以及广大爱好者和专业人员共同搭建和维护的互联…

8.12 PowerBI系列之DAX函数专题-分组内动态TopN和others

需求 实现 1 度量值 total amount2 var v_total calculate([total amount],removefilters(productnames[])) // return if(isinscope(productnames[产品名称]),//第一个参数//下面部分为if的第二个参数,是一整段的DAX表达式var v_Topn_no [topN参数 值] //获取当…

安科瑞能耗监测系统在新集卫生院综合楼、急诊楼的设计与应用

安科瑞 崔丽洁 摘要:针对医院建筑能耗高且能源管理不合理的问题,利用计算机网络技术、通讯技术、计量控制技术等信息化技术,实现能源资源分类分项计量和能源资源运行监管功能,清晰描述建筑内总的用能现状;实时监测各供…

WinSCP 集成 putty(也可以其他Terminal客户端)

putty 安装 官网安装地址 WinSCP集成putty(也可以其他Terminal客户端) 扩展 WinSCP是什么? WinSCP(Windows Secure Copy Protocol)是一个用于 Windows 操作系统的开源的 SFTP(SSH File Transfer Protoc…

【操作系统】虚拟内存串讲

文章目录 概述虚拟页管理请求页表物理地址的获取虚拟页大小与内存块大小的探讨 概述 操作系统为每一个进程分配一个独立的虚拟内存空间,以分页系统为例,每个进程的虚拟页号都是从 0 开始的 不同的进程可以使用相同的虚拟页号,并且不会互相影…

AFL模糊测试+GCOV覆盖率分析

安全之安全(security)博客目录导读 覆盖率分析汇总 目录 一、代码示例 二、afl-cov工具下载 三、编译带覆盖率的版本并启动afl-cov 四、AFL编译插桩并运行afl-fuzz 五、结果查看 AFL相关详见AFL安全漏洞挖掘 GCOV相关详见GCOV覆盖率分析 现将两者结合,即进…

10.17七段数码管单个多个(部分)

单个数码管的实现 第一种方式 一端并接称为位码;一端分别接收电平信号以控制灯的亮灭,称为段码 8421BCD码转七段数码管段码是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码, 段码就是LED灯的信号 a为1表示没用到a,a为…

多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…

LeetCode 高频题目分类列表

💡 LeetCode 高频面试题分类列表,总共24类,312道题目! 图 133.克隆图 207.课程表 210.课程表 II 399.除法求值 547.省份数量 684.冗余连接 743.网络延迟时间 785.判断二分图 堆 215.数组中的第K个最大元素 295.数据流的中位数 26…

apache log4j漏洞复现

log4j是开源的java存储日志的框架,一般都是大企业用,小企业自带的日志功能足够使用,Log4j2是默认支持解析ldap/rmi协议的,打印的日志中包括ldap/rmi协议都行。 具体介绍参考以下文章: log4j2---基于vulhub的log4j2漏…

冲刺十五届蓝桥杯P0006平面切分

文章目录 题目思路代码总结 题目 平面切分 思路 这道题是一个思维题把,之前没有接触过平面几何的知识,做起来感觉还是比较难的,用到的set集合和自己创建一个类 首先我们知道,一根直线A是可以将平面切分成两块的,如…

keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

目录 keep-alive 使用 keep-alive 的示例代码: 手动清除组件缓存的示例代码: keep-alive 组件有以下几个优点: keep-alive 的原理: 使用 keep-alive 组件,你可以包裹需要缓存的组件,然后这些组件在切…

Linux中的主要系统调用

Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(C…

精准定位——MySQL日志学习的一天【错误、二进制、查询、慢查询】

MySQL 日志是记录 MySQL 数据库服务器运行过程中的各种活动和事件的文件。它们对于监控、故障排查、性能优化和数据恢复等方面都非常重要。 回顾一下Linux中查看文件的指令操作 cat 命令: cat 命令用于将文件的内容一次性输出到终端。它的主要功能是将文件连接起来…

Jetpack:011-Jetpack中标题栏

文章目录 1. 概念介绍2. 使用方法2.1 标题与导航2.2 详情菜单 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中进度条相关的内容,本章回中主要介绍 标题栏。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍 我们在本章回…

大型公共建筑能耗监测与信息管理系统研究及产品选型

摘要:文章通过阐述大型公共建筑能耗现状,突出大型公共建筑实施节能监管的必要性,并在系统总结运用技术手段实施建筑能耗监测的基础上,介绍了江苏省建筑能耗监测系统研究过程中的技术创新和应用情况。 关键词:公共建筑…