Mysql Server原理简介

news2024/11/27 2:19:39

Mysql客户端包括JDBC、 Navicat、sqlyog,只是为了和mysql server建立连接,向mysql server提交sql语句。

mysql server组件

  • 第一部分叫连接器

主要承担的功能叫管理连接和验证权限,每次在进行数据库访问的时候,必然要输入用户名和密码,进行权限的验证之类的。

查看当前数据库正在建立的连接有几个:

  • 第二个部分叫分析器

sql语句就是一堆的字符串,server拿到这一系列字符串之后需要对当前字符串进行解析操作;

最终一个sql语句,无论多简单都会转换成一个树形结构(AST 抽象语法树),

这里面会做2个基本操作一个是词法分析一个是语法分析,最终会转换成一个抽象语法树,

sql语句在正常执行的时候都是按照这样一个树形结构来执行的。

一般情况下sql语句在进行语法分析的时候,根据输入自动生成语法树并可视化显示出来。

开源的语法分析器常用的2个组件是Antlr、Apache Calcite,如果公司自研sql中间件,可能会涉及到sql语句解析工作,可以基于这2个组件来实现。

将这个sql语句转换成这样的树形结构,

绿色的代表关键字token,按照这样的树形结构来进行具体server的解析工作。

  • 第三部分叫优化器

对于这样的sql语句先读取t1表还是先读取t2表,这是优化器来选择的,主要依据于2个标准,第一个标准叫RBO,第二个标准叫CBO;RBO基于规则的优化,CBO是基于成本的优化,现在主流的数据库CBO用的是比较多的,RBO用的比较少。

  • 第四个组件-执行器

执行sql,执行器是需要和存储引擎进行交互的,需要从存储引擎里面把数据查询出来并且返回给客户端,

怎么理解存储引擎

mysql的数据文件存在磁盘,不同的存储引擎在磁盘上的存储形式是不一样的,不同的数据文件在磁盘是不同组织形式,统一的概述叫存储引擎。

Innodb存储引擎文件中有2个同名的文件,frm(表结构相关的元数据信息)和ibd(数据文件和对应的索引文件)。

**MyISAM存储引擎文件中有3个同名的文件,frm(表结构相关的元数据信息)和MYD(数据)和MYI(索引),数据文件和索引文件是分开的。

还包含一个查询缓存组件,8.0以上取消了,因为数据命中率非常低,需要经常的更新里面的数据。

为什么要使用B+树这样的数据结构,自己设计的话,怎么设计?

索引的意义是加快数据访问,提高查询效率,数据存储在磁盘,从磁盘中读取效率很低,特别是在读取大量数据的时候,瓶颈是卡在硬件层面。将电脑机械硬盘换成SSD固态硬盘,速度快,在软件设计的时候可以对io操作进行相关的优化,优化的时候可以考虑2个纬度:

1、尽可能读取少量的数据,减少io量

2、减少io次数

数据是存储在磁盘的,从磁盘读取数据的时候需要涉及到磁体的移动或者说寻址的时间,这都是太浪费时间的,所以能一次性读取就不读取2次。

索引到底要存储什么样的数据?索引的数据格式是什么?

一个非常大的文件里面存储一行一行的数据,如何去定位我想要的数据在哪个位置?并且如何把对应数据位置的数据读取出来?

应该选择什么样的数据格式来存储数据?

在创建索引的时候一定有个key值每次根据key找到了整行的value值,k是字段信息,v是文件名称以及偏移量(可以把当前数据读取出来)以及读取的数据长度,这样的结构会有一个非常大的问题,当数据文件变的越来越大的时候,当前存储索引的文件有可能会变得非常大;数据文件和索引文件的可能会变得非常大,有必要在索引文件的前面再给它建一个索引,不断的在前面加索引,这很明显是不合适的。

OLAP联机分析处理,主要对历史数据进行分析,产生决策,不要求短时间内返回结果,比如数据仓库HIVE,在HIVE中索引确实是这样的方式存在的,但不要求短时间内返回结果;

OLTP联机事务处理,支撑业务系统的需要,在短时间内返回对应的数据结果,比如数据库mysql必须在秒级别和毫秒级别返回数据。

存储k-v格式的数据需要使用什么样的数据结构?

哈希表、二叉树、红黑树、B树、B+树这些数据结构都是存储k-v格式的数据。

把磁盘所有的数据文件全部一口气读取到内存,把所有的索引文件都放入内存,这是不太可能的,所以需要分块读取,分而治之,很多大数据设计都用了这个理念。

哈希表存在什么样的问题

使用哈希表的意义是为了让数据尽可能的散列,因此在使用哈希表的时候要选择合适的哈希算法,避免hash碰撞 和哈希冲突。

如图所示数据不是散列均匀的,数据都集中在1和3号位置;哈希表存储的数据是无序的,当需要进行范围查询的时候只能进行挨个遍历对比,效率极低,哈希表在读取数据的时候不能一块一块去读。

虽然索引没有hash表的数据结构,但是mysql里面有hash索引,mysql中的memory存储引擎支持哈希索引,innodb存储引擎支持自适应hash。

二叉树,BST(binary search tree 二叉搜索树),AVL(平衡二叉查找树),红黑树,这四个的共同点是最多只能有2个分支;BST、AVL、红黑树这3个是有序的,左子树必须小于根节点,右子树必须大于根节点;AVL和红黑树都是平衡的。

三层的树结构,存满之后,最多可以装多少条数据?

2的3次方-1=7条,

如果想存储更多的数据,只能将树的高度提高,变成四层或五层或更多层,层数变多会有什么影响吗?

io次数会变多,磁盘预读,内存跟磁盘进行数据交互的时候,有一个最基本的逻辑单位称之为页或datapage,页的大小是跟操作系统相关的,一般是4kb或8kb;在进行数据读取的时候,一般操作的是页的整数倍。

当这里有一个页的概念了,内存和磁盘交互的时候是有页了,和刚才说的分而治之关联起来,这里就是天然的分好的块了。

页如果存不满,可以放其他东西吗?

8bit(位)= 1Byte (字节),1024Byte(字节)=1KB,占不满还是占4KB的空间。

每一个节点,如果只能存储一个数据值的话,如果想让它存储更多数据的话,要加层,

每一层或每一个节点里面读取的时候,都是一页一页的,层数加多了,会导致io量变多。

既要尽可能多的存储数据,还要减少io的次数,减少树的高度,如果不能变高,那这个树可以变形吗?如果一个节点放多个值呢?

原来是二叉树,让当前这个结构变形为多叉树,当变成多叉树之后,就意味着孩子节点变多了,树变矮了,有序 且平衡,就变成了一个B树了。

需要把这个B树模型做一个过渡,用来存数据库表和行数据,这个值变成几种类型的数据,首先第一个存放数据的时候key值是要有的,根据key值检索到对应的数据。

每个方块就代表读取的n个页的信息,每次在进行数据交互的时候读取页的整数倍,每个方块表示读页的整数倍 默认假设16kb,每个磁盘快包含三种类型的数据,16、32表示具体的key值,data表示实际的行数据,p1表示实际的指针。

3层的树,如果要读取28这条数据的话,先读取磁盘块1,把28和36、34对比,正好在中间,沿着p2指针把磁盘块3读取过来,把磁盘块3读取过来之后,再把28和25、31对比,正好在中间,把磁盘块8读取出来,一共读取了3个磁盘块。

在innodb存储引擎里面有一个变量,

默认读取16kb的数据,每个磁盘块占16k,一共读了48kb的数据,如果这个B树只有3层,存满了之后可以存多少条数据?

假设一个data占1kb,磁盘块1最多能有几个子节点?

最多15个data,16个范围,最多有16个子节点,每层16,三层16 x *16 x *16 = 4096条记录,

为什么三层的B树只能存4000条数据?谁占用了大量的存储空间?

是data,能不能把data去掉?

所以在B树的基础之上有了B+树,

B树数据没有重复的,

B+树叶子节点包含了全量的数据,非叶子节点包含了部分数据即有一定数据冗余。

所有的data都放到叶子节点里面去了,非叶子节点不存储实际的数据,只有在叶子节点才会存储实际的数据,这样的一个3层B+ Tree,如果存满的话,可以支持多少数据量的存储?

一个磁盘块16kb,读一次,3层,3个磁盘块,比如读取磁盘块1->磁盘块3->磁盘块7,依然读取了48kb的数据,假设磁盘块1中的p1+28占了10个字节,16*1024/10大约1600个子节点,第二层一个磁盘块也是1600个节点,第三层只能存16条,存满的话1600 x 1600 x 16=40960000,千万级别。

B+tree的索引一般是3层,一般情况下3-4层的B+tree足以支撑千万级别的数据量存储,

刚刚计算公式谁占了绝大部分空间?指针的大小是不变的,索引列的值是有可能会变化的,索引影响最大的是key这个值,所以要保证key尽可能小的占用存储空间。

在创建索引的时候,用int类型好?还是varchar类型好?

int占4个字节,但是varchar占用的字节是自己指定的,比如varchar(3),即谁占用的空间小,就用哪个列作为索引。

mysql表创建的时候,主键要不要自增?在满足业务系统支撑的情况下尽可能的自增,这里面会涉及到索引的维护。

假设磁盘块5最多只能放4条记录,

当存满了之后,要插入一条14的记录,底层的叶子节点是有顺序的,所以要把磁盘块5拆分成2个磁盘块,11、12

和13、15,分开之后,上层磁盘块2也需要增加一个指针,如果磁盘块2也满了,也要分裂成两个....

所以在进行数据插入的时候,有可能会影响到上层的新增,就会很麻烦。

而递增后到效果是在后面追加就行了,对上层没有影响,所以在满足业务系统的情况下,尽可能的自增,而分布式环境下可以通过雪花算法自增。

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

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

相关文章

421 Maximum login limit has been reached. on hdfs-over-ftp

使用 hdfs-over-ftp 时登录报错421 Maximum login limit has been reached. 本地测试连接第10个用户的时候会报这个异常 就是默认限制了用户登录数量。 DefaultConnectionConfig.java里private int maxLogins 10; 在HdfsOverFtpServer.java里修改了startServer()这个metho…

MSTP基础

MSTP基础引入背景技术概览PVSTP(过渡)MSTP单生成树的缺陷1:部分VLAN不通单生成树的缺陷2:无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进,实现了网络拓扑快速收敛。但由于局域网…

【redis学习篇】Redis三种持久化方式详解

官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储,如固态磁盘(SSD)。Redis提供了一系列持久性选项。其中包括: RDB(快照):RDB持久性以指定的时间间隔执行数据…

程序员的上帝视角(4)——视角

对于开发人员来说,工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同,得到的设计方案可能是完全不同的。作为一个程序员,不能单单从个人视角来看待问题。而是要尝试从不同角色出发,不停思考。上…

C++——内存管理

一,为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样,而如何让各个类型在内存中合理分布就非常有必要,由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性,我们习惯于我们的日常世界,它以线性方式运作,没有不连续或突跳。 为此,我们学会了期望各种过程以连续方式运行,我们的内心为了让我们更有安全感,把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中,介绍了反转链表 我们利用了链表是逻辑连续的特点,逆置了链表的逻辑连接顺序,从而实现反转链表: 戳我查看反转链表详…

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中,表达式是由操作数、运算符和函数调用等组成的语法结构,可以进行各种数学运算、逻辑判…

Maven环境下构建多模块项目

使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建 这里以四个模块为例来搭建项目,以达到通俗易懂的初衷 模块 maven_parent -- 基模块,也就是常说的parent (pom) 模块 maven_dao -- 数据库访问层,例如jdbc操作(jar) …

华为OD机试题,用 Java 解【查找重复代码】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

深度学习技巧应用3-神经网络中的超参数搜索

大家好,我是微学AI,今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中,一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数,例如:学习率、正则…

计算机科学导论笔记(三)

五、计算机组成 计算机组成部件可以分为三大类(子系统):中央处理单元(CPU)、主存储器和输入/输出子系统。 5.1 中央处理单元(CPU) 中央处理单元用于数据的运算,分为算术逻辑单元&a…

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见,本文提到的编程语言指的是「第三代高级编程语言」。 首先,我们从时间维度入手聊聊编程语言。一图胜千言,我们从目前主流的编程语言中,挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1:中药店,每个抽屉外面贴着标签 举例2:超市购物架上很多瓶子,每个瓶子装的是什么,有标签 举例3:家庭厨房中: Java中的泛型,就类似于上…

Spark 平衡 CPU

Spark 平衡 CPUCPU/内存平衡CPU 低效线程挂起调度开销优化 CPUCPU/内存平衡 Spark 将内存分 : Execution Memory : 用于分布式任务执行Storage Memory : 用于 RDD 缓存RDD 缓存展开前消耗 Execution Memory , 最后占用 Storage Memory 线程/执行内存关系: 执行内…

Eclipse快捷键,IDEA中使用Eclipse快捷键

/** Eclipse中的快捷键:* 1.补全代码的声明:alt /形参提示:Ctrl alt /* 2.快速修复: ctrl 1 * 3.批量导包:ctrl shift o* 4.使用单行注释:ctrl /* 5.使用多行注释: ctrl shift / * 6.取消多行注释…

《数据解构》HashMap源码解读

👑作者主页:Java冰激凌 📖专栏链接:数据结构 目录 了解HashMap HashMap的构造 两个参数的构造方法 一个参数的构造方法 不带参数的构造方法 哈希表初始化的长度 HashMap源码中的成员 Pt Get 了解HashMap 首先我们要明…

C语言——文件操作

文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入(出)4.2 格式化写入(出)4.3 二进制输入&#…

拼多多的赶超让京东感受到压力,如今才发起百亿补贴可能晚了

近段时间以来,京东推出百亿补贴计划的宣传可谓铺天盖地,看起来京东这是要奋起反击了,然而拼多多如今的体量已经足够大,超越了京东,京东再发起反击已经晚了。一、拼多多超越了京东在用户数方面,早在2021年底…

GitLab创建仓库分配权限

文章目录创建仓库分配权限参考资料创建仓库 点击“New project”创建新项目 分配权限 点击左侧菜单栏“Members”成员,菜单 “Invite member”邀请成员,添加人员;“Invite group”邀请组织,添加一个组织所有成员下面输入框搜索…