数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDBMyISAM、 Memory等。简单地理解,存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色,使用的是一个可插拔存储引擎架构,能够在运行的时候动态加载或者卸载这些存储引擎。不同的存储引擎决定了MySQL数据库中的表可以用不同的方式来存储。我们可以根据数据的特点来选择不同的存储引擎。在MySQL中的存储引擎有很多种,可以通过SHOW ENGINES语句来查看:

Support列中,YES表示当前版本支持这个存储引擎;DEFAULT表示该引擎是默认的引擎,即InnoDB

下面重点关注InnoDBMyISAMMEMORY这3种。

InnoDB存储引擎

① InnoDB是事务型数据库的首选引擎,支持事务ACID,简单地说就是支持事务完整性、一致性。

② InnoDB支持行级锁。行级锁可以在最大程度上支持并发,以及类似Oracle的一致性读、多用户并发。

③ InnoDB是为处理巨大数据量的最大性能设计,InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。

④ InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显式在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。

⑤ InnoDB支持崩溃数据自修复。InnoDB存储引擎中就是依靠redolog来保证的。当数据库异常崩溃后,数据库重新启动时会根据redolog进行数据恢复,保证数据库恢复到崩溃前的状态。

MyISAM存储引擎

① MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用。

②其锁定机制是表级索引,虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。

③不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

④只会缓存索引:MyISAM可以通过key_buffer缓存,以大大提高访问性能减少磁盘I/O,但是这个缓冲区只会缓存索引,而不会缓存数据。

⑤适用于不需要事务支持(不支持)、并发相对较低(锁定机制问题)、数据修改相对较少(阻塞问题)、以读为主这类场景。

MEMORY存储引擎

MEMORY存储引擎是MySQL中的一类特殊存储引擎,使用存储在内存中的内容来创建表,而且所有数据也放在内存中。

①每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构,数据文件则存储在内存中。

② MEMORY默认使用哈希索引,速度比使用B型树索引快。如果想用B型树索引,可以在创建索引时指定。

③ MEMORY存储引擎是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,那么所有数据都会消失。

在实际工作中,选择一个合适的存储引擎是比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那么选择InnoDB有很大的优势。如果表主要是用于插入记录和读出记录,那么选择MyISAM能实现处理高效率。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMORY,它对表的大小有要求,不能建立太大的表.

MySQL逻辑架构

MySQL逻辑架构整体分为3层:

第一层是客户端层,所包含的并不是MySQL独有的技术,它们都是服务于C/S程序或者是这些程序所需要的,诸如连接处理、身份验证、安全性等功能均在这一层处理。

第二层是SQL层(SQL Layer),因为这是MySQL的核心部分,通常也叫作核心服务层。在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL解析、执行计划优化、Query cache的处理以及所有内置的函数(如日前时间、加密等函数)、存储过程、视图、触发器等。

第三层是存储引擎层(Storage Engine Layer),是底层数据存取操作实现的部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据,类似Linux的众多文件系统。每个存储引擎都有自己的优势和劣势,通过存储引擎API来与它们交互,这些API接口隐藏了各个存储引擎不同的地方。对于查询层尽可能透明。

虽然看起来MySQL架构好像比较简单,但是实际上每一层中都含有各自的很多小模块,尤其是第二层SQL Layer,结构蛮复杂的,如图:

我们简单地做如下剖析:

(1)Connectors:指的是不同语言中与SQL的交互。

(2)Management Services & Utilities:管理服务和工具组件,从备份和恢复的安全性、复制、集群、管理、配置、迁移和元数据等方面管理数据库。

(3)Connection Pool:连接池,是为解决资源的频繁分配﹑释放所造成的问题而为数据库连接建立的一个“缓冲池”。原理是预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。它的作用是进行身份验证、线程重用、连接限制、管理用户的连接、线程处理等需要缓存的需求。

(4)SQL Interface(SQL接口):接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。

(5)Parser:解析器,验证和解析SQL命令。SQL命令传递到解析器的时候会被解析器验证和解析,并生成一棵对应的解析树。在这个过程中,解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等。

(6)Optimizer:查询优化器。SQL语句在查询执行之前,会使用查询优化器对查询进行优化,得出一个最优的策略。多数情况下,一条查询可以有很多种执行方式,最后都返回相应的结果。优化器的作用就是找到其中最好的执行计划。用一个例子就可以理解,比如“select uid,name from user where gender=1”。这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行gender过滤;这个select查询先根据uidname进行属性投影,而不是将属性全部取出来以后再进行过滤;将这两个查询条件联接起来生成最终查询结果。

(7)Cache和Buffer:主要功能是将客户端提交给MySQL的selectquery请求的返回结果集缓存到内存中,与该query的一个hash值做一个对应。该query所取数据的基表发生任何数据的变化之后,MySQL会自动使该queryCache失效。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key缓存、权限缓存等。

(8)Pluggable Storage Engines:可插拔存储引擎。MySQL区别于其他数据库的最重要的特点就是其插件式的存储引擎接口模块,这个可以说是MySQL数据库中最有特色的一个特点了。目前,各种数据库产品中只有MySQL可以实现底层数据存储引擎的插件式管理。这个模块实际上只是一个抽象类,根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制,这种访问机制就称为存储引擎。正是因为它成功地将各种数据处理高度抽象化才成就了今天MySQL可插拔存储引擎的特色。每个存储引擎开发者都可以按照自己的意愿来进行开发,存储引擎是基于表的。MyISAM存储引擎的查询速度快,有较好的索引优化和数据压缩技术,但是它不支持事务。InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。Memory使用存储在内存中的数据来创建表,而且所有的数据也都存储在内存中。

(9)File System:数据存储在运行于裸设备的文件系统之上,支持的文件类型有EXT3、EXT4、NTFS、NFS。

(10)File&Logs:数据文件以及redo、undo等各种日志文件。

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

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

相关文章

软件设计师学习笔记12-数据库的基本概念+数据库的设计过程+概念设计+逻辑设计

1.数据库的基本概念 1.1数据库的体系结构 1.1.1常见数据库 ①集中式数据库 数据是集中的;数据管理是集中的 ②C/S结构 客户端负责数据表服务;服务器负责数据库服务;系统分前后端;ODBC、JDBC ③分布式数据库 物理上分布、逻…

three.js学习之vR展厅

目标 1、需要会的知识点three.js的场景,摄像机,渲染器,轨道控制器,坐标轴,场景适配,渲染循环创建立方缓冲几何体、纹理、3d物体 实现:创建立方几何体,纹理贴图镜面反向渲染&#xf…

Flutter配置Android SDK路径

在使用VSCode作为开发Flutter的工具时,当选择调试设备时,通常看不到android的模拟器,只能看到Chrome之类的。 原因就是Flutter找不到Android的SDK路径,所以无法识别模拟器,我们用flutter doctor命令检查环境时&#xf…

uniapp物理键/右滑多次退出应用,再次进入显示白屏的问题

复现方式:安卓多次使用物理返回键或右滑退出应用后, 再次进入有很大机率显示白屏。但是手动杀进程的方式不会出现白屏和后台驻留的方式也不会出现白屏 解决思路:利用后台驻留的方式进行假退出应用,把应用隐藏至后台,这…

基于STM32_DS18B20单总线传感器驱动

基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20?二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单…

Centos (含Rocky-Linux) VSFTPD 简单设置

本文并非深入讨论vsftp配置的文章,仅以能连通为目的,适合那些临时需要上传点东西到服务器的场景。 一、安装 dnf -y updatednf -y install vsftpdsystemctl start vsftpdsystemctl enable vsftpd二、防火墙 开放21端口: firewall-cmd --zo…

C# 通过winmm枚举音频设备

文章目录 前言一、如何实现?1、添加依赖(1)、nuget安装winmm的封装库(2)、补充接口2、定义实体3、实现枚举 二、完整代码三、使用示例总结 前言 使用C#做音频录制时需要获取音频设备信息,比如使用ffmpeg进…

[LitCTF 2023]导弹迷踪

这道题相较于其他的分数类型的js题有一点不一样,他不是像常规的有用bp多次抓包修改最后得分来获取flag的。 本题将flag藏到了他的前端文件中本身没有任何难度,只是为了记录一种新的做法 按照我们平常做js的思路就是先随便玩一下然后bp抓包看得分或者抓包…

解决github加载过慢问题

github打不开怎么办?看到这篇文章,一切都稳了! DNS被污染,一句话,修改系统hosts文件! 1.hosts文件在哪?C:\Windows\System32\drivers\etc 2.用记事本打开hosts,在最后加入以下两行…

【斗罗2】天梦哥抓捕冰帝,霍雨浩与她完美融合,喜提五挂

Hello,小伙伴们,我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 斗罗大陆动画第二部绝世唐门第19集预告终于更新了,看到公布时间,大半夜才发布,着实不过瘾。不过剧情相当炸裂,天梦哥与冰帝对峙,造神计划正…

skywalking动态配置[集成nacos/apollo/consul]

说明:以下配置仅关于的阈值规则的动态配置,其他参数也可以进行配置。 1,skywalking动态配置集成nacos 编辑application.yml nacos配置参数如下: nacos:# Nacos Server HostserverAddr: 10.10.5.145# Nacos Server Portport: 8848# Nacos Configuration Groupgroup: skywal…

electron 升级 v22 遇到问题

Electron 漏洞 https://mp.weixin.qq.com/s/5LpSJb_5uV8EIDOl3fz9Tw 由于 23以上不在支持win 7 8 8.1 所以我选择安装 v22.3.24 electron 22.3.24 node-sass 6.0.1 sass-loader 10.4.1 对应的版本 npm i node-sass6.0.1 --sass_binary_sitehttps://npm.taobao.org/mirrors…