详谈数据库InnoDB引擎与MyISAM引擎

news2024/11/27 16:40:21

1. 简单了解什么是存储引擎?

相信很多人在听到存储引擎这个名字的时候可能会有些疑惑,听着名字就觉得有些难,导致很多人没有兴趣了解它,那么它这究竟是个什么东西?

我来说明一个场景,大家就能大概明白它是做什么用的了。

我们都知道,既然是数据库,我们就是用来存储数据的,数据库中会有很多的表,那么各位有没有想过数据库底层究竟是以什么样的格式存储这些表的数据的呢?

这就会用到我们存储引擎,存储引擎在以前叫做表处理器,是后来才改名叫存储引擎的,它的功能就是接收收到的指令,然后对表中的数据进行读写操作。你可以把它理解为存储数据库的表时表的类型,在MySQL数据库中,有很多的存储引擎,它们在存储数据库的表时存储格式也是不一样的。

举个栗子,假设我们的学生表 t_student 使用了A存储引擎,那么底层存储学生表信息时采用了 .txt 文本文件的格式进行存储;我们的用户表 t_user 使用了B存储引擎,那么底层在存储用户表中的信息时会采用 .doc Word文档的形式存储。也就是说,存储引擎不同,数据库底层在存储这些表的数据的时候采用的存储格式也不相同,这样说各位应该就能理解了吧。

在 MySQL数据库中,有好多种存储引擎,这里我重点说明 InnoDB和MyISAM,这两种也是面试中经常问到的两种引擎,问的最多的也是这两种引擎的原理和区别。

2. InnoDB 引擎概述

(1)MySQL 自从 3.23.34 开始就包含了InnoDB引擎,在 5.5 的版本之后 InnoDB 成为了 MySQL 的默认存储引擎;

(2)InnoDB 引擎对于数据的增删改查都具有很好的性能支持;

(3)InnoDB 本身是为了处理巨大量的数据的最大性能而设计的, 当我们表中存储的数据非常非常多时,InnoDB 存储引擎能很好地发挥出它性能的优越性,这与它底层存储数据和索引的结构有关系。

(4)InnoDB 引擎还支持数据库表外键的功能。而且,InnoDB 引擎是MySQL数据库众多引擎中唯一一个支持事务的引擎,可以确保事务的完整提交(Commit)和回滚(Rollback)。在一般情况下,我们建表时都会使用InnoDB作为存储引擎,因为现在绝大多数业务都需要用到事务,而InnoDB引擎又是唯一一个支持事务的存储引擎。

(5)大家可能不知道,在数据库的底层,当你使用不同的存储引擎,它们底层在存储数据的时候生成的文件也是不同的,在8.0以后的版本中 ,InnoDB 存储引擎中数据文件就只有一个 表名.ibd 文件了,它里面不仅会存储表的结构以及表的数据,还有索引也会一并存入其中,生成一个文件,合三为一,这一点要记住,与下面我们要说的 MyISAM 引擎存储数据时文件的格式有别哦!

(6)正是由于 InnoDB 存储引擎将所有的信息存储到了一个数据文件中,所以在读取数据时,InnoDB 引擎不仅要缓存表的数据,还要缓存表的索引,表中的数据如果很多,那么索引占据内存也会很大,因此从另一方面来讲 InnoDB 引擎对内存要求较高,效率也会受内存的影响。

(7)此外,因为 InnoDB 存储引擎支持事务,所以当我们的数据库在受到网络波动或者服务器宕机等一系列不可控不过因素导致崩溃时,它就会开启事务保护功能,我们再次重启数据库服务器,它就会自动从上一次崩溃的时候重新恢复数据,正常运行,极大程度地保证了我们数据的安全性。

3. MyISAM 引擎概述

(1)MyISAM 引擎也是数据库中一个比较重要的引擎,它提供了大量的特性,全文索引,压缩,空间函数等,但不支持事务,行级锁,外键等功能。因此当服务器崩溃时,它就无法基于事务的功能保证数据的安全性,崩溃后数据也无法恢复。

(2)在5.5 版本之前,MyISAM 是数据库的默认存储引擎,到了5.5 版本之后才从 MyISAM 转换成了 InnoDB 。

(3)MyISAM 存储引擎中数据的优势是访问速度特别快,主要针对于对事务完整性没有要求的 SELECT与INSERT 两个操作。最形象的就是历史相关软件,我们可以向数据库中添加历史信息,查询浏览历史信息,但几乎不会去更新历史信息或者删除历史信息,否则不就成了纂改历史了吗。

(4)MyISAM 存储引擎中,它是有一个常量存储表中的数据量的,即 COUNT(*),因此他的时间复杂度为O(1);而我们的 InnoDB 存储引擎在去统计数据时,则是去一条数据一条数据的累加,是现用现算,因此时间复杂度为O(n),因此在数据量的统计上来说,MyISAM 引擎性能是高于 InnoDB 的。

(5)刚才我们提 InnoDB 引擎的时候他也说到了,它的数据文件适合成了一个文件,而 MyISAM 则没有,它是分成了三个文件,分别存储表的结构,表的数据以及表的索引。在底层形成的三个文件分别是  表名.frm(存储表结构),表名.MYD(存储表的数据),表名.MYI(存储索引)。

4. InnoDB 与 MyISAM 的一些区别

InnoDB 存储引擎与 MyISAM 的一些区别我直接放到下边了,重点记住我画线的五个;

这要是给大家来说说行表锁。

行表锁其实不难理解,我举个栗子各位就懂了。

假设现在有一张用户表,有张三和李四,如果我们采用的是 InnoDB 存储引擎,当我们对张三数据进行读写操作的时候,我们只会把张三这一行的数据锁起来,不让其他的线程的读写操作对我们造成干扰,但是如果有线程想要操作李四的信息,是完全可以的,因为李四的数据并没有被锁起来,我们锁住的就是张三这一行的数据;

而假如说我们采用的是 MyISAM 存储引擎,当我们对张三的数据进行读写操作的时候,会把整张用户表都锁起来,即便是有其他操作想要对李四进行读写操作也不行,必须等到张三的信息操作完成才可以,这样各位就能理解了吧!

其实这个行表锁有点类似于Java中的 HashTable与ConcurrentHashMap,HashTable就是操作时锁起来整个数据,不让其他线程进来,而ConcurrentHashMap 则是只锁我们链表的头节点,对其他哈希桶位元素的操作不影响,能够适应多线程并发操作。

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

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

相关文章

【kubernetes】在k8s集群环境上,部署kubesphere

部署kubesphere 学习于尚硅谷kubesphere课程 前置环境配置-部署默认存储类型 这里使用nfs #所有节点安装 yum install -y nfs-utils# 在master节点执行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports # 执行以下命令&#xff…

mybatis(下)

注解方式 常用注解标签 Insert:插入 sql , 和 xml insert sql 语法完全一样 Select :查询 sql, 和 xml select sql 语法完全一样 Update :更新 sql, 和 xml update sql 语法完全一样 Delete :删除 sql, 和 xml delete sql 语法完…

【深入理解ES6】字符串和正则表达式

概念 字符串(String)是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol(es6新增)。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种: 前 个码位均以16位的编码单元…

Excel表格制作,快速提升效率好方法!

“作为一个刚开始工作的职场新人,每天要做各种不同的表格,真的让我很崩溃,感觉我对这些表格制作一点都不了解,Excel表格制作有什么比较好的方法吗?” Excel作为一款广泛应用于各个领域的管理和分析工作,给我…

SAP ME2L/ME2M/ME3M报表增强添加字段(包含:LMEREPI02、SE18:ES_BADI_ME_REPORTING)

ME2L、ME2M、ME3M这三个报表的字段增强,核心点都在同一个结构里 SE11:MEREP_OUTTAB_PURCHDOC 在这里加字段,如果要加的字段是EKKO、EKPO里的数据,直接加进去,啥都不用做,就完成了 如果要加的字段不在EKKO和EKPO这两个…

RISC-V公测平台发布 · 7-zip 测试

简介 7-Zip 是一个开源的压缩和解压缩工具,具有高压缩比和快速解压缩的特点。除了普通的文件压缩和解压缩功能之外,7-Zip 还提供了基准测试功能,通过压缩和解压缩大型文件来评估系统的处理能力和性能。 7-Zip 提供了一种在不同压缩级别和多…

浅析kubernetes部署:javashop部署概览

javashop部署概览 节点规划 首先我们对节点进行规划,方便起见,我们进行如下简单的规划: 这里请根据您的实际情况进行合理的资源安排,或和我们售后工程师讨论形成方案。 域名规划 我们以test.com为主域名规划我们的系统域名如下&…

qq录屏怎么弄?手把手教会你!

“有没有人知道qq怎么录屏呀,听说qq可以录屏,刚好最近需要录制屏幕,就想用qq去录,但是找了很久,都没找到,有人知道吗,谢谢了。” 在如今数字化时代,屏幕录制已成为广泛使用的工具。…

云计算——存储虚拟化功能

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前期回顾 前言 一.存储虚拟化功能 1.精简磁盘和空间回收 2.快照 (1&a…

Qt应用开发(基础篇)——滚屏区域基类 QAbstractScrollArea

一、前言 QAbstractScrollArea滚屏区域抽象类继承于QFrame,QFrame继承于QWidget,是QListview(列表浏览器)、QTableview(表格浏览器)、QTextEdit(文本编辑器)、QTextBrowser(文本浏览器)等所有需要滚屏区域部件的抽象基类。 框架类QFrame介绍 QAbstractSc…

高忆管理:概念火认购却不火!ESG理财如何打破僵局?

曾几何时,国内ESG理财曾被贴上“小众”标签,现在,跟着ESG理念的遍及与深化群众,这一“小众”的出资理念正在走向“群众”。 有银行理财子公司人士向证券时报券商我国记者表示,从组织视点来看,以债券类为主的…

【AI作画】使用Stable Diffusion的艺术二维码完全生成攻略

文章目录 前言Stable Diffusion 简介 什么是云端平台?优势灵活性和可扩展性成本效益高可用性和容错性管理简便性 选择适合的云端平台 平台优势平台操作购买算力并创建工作空间启动工作空间应用市场一键安装 使用Stable-Diffusion作图使用控制网络将文本转图像二维码…

windows pip安装出现 error: Microsoft Visual C++ 14.0 is required

可参考:如何解决 Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools“_不吃香菜的小趴菜的博客-CSDN博客 一、安装Visual Studio2022 1、下载:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 我这使…

【前端|Javascript第4篇】详解Javascript的事件模型:小白也能轻松搞懂!

前言 在当今数字时代,前端技术正日益成为塑造用户体验的关键。而其中一个不可或缺的核心概念就是JavaScript的事件模型。或许你是刚踏入前端领域的小白,或者是希望深入了解事件模型的开发者,不论你的经验如何,本篇博客都将带你揭开…

iTOP-STM32MP157开发板Linux Misc驱动编写实验程序(运行测试)

启动 STM32MP157 开发板,我们通过 nfs 挂载共享文件目录,我们进入到共享目录,加载驱动模块如 图所示: insmod misc.ko 驱动加载成功后,输入以下命令,查看注册的设备节点是否存在,如下图所示&a…

NSI45030AT1G LED驱动器方案为汽车外部及内部照明恒流稳流器(CCR)方案

关于线性恒流调节器(CCR):是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时,CCR会减少功率晶体管的导…

激战本地生活:抖音美团打得火热,小红书也来“搅局”?怎么开通小红书本地生活服务商呢?

小红书也来本地生活赛道“横插一脚”了。 上线面向本地生活的交易合作服务平台、推出面向达人的探店内容扶持计划、“0押金、0佣金、流量扶持” 激励更多商家入场......在已经硝烟弥漫的申请cmxyci本地生活赛道,小红书开始放大招。 据了解,小红书是在今年…

sift-1M数据集的读取及ES插入数据

sift是检查ann近邻召回率的标准数据集,ann可以选择faiss,milvus等库或者方法;sift数据分为query和base,以及label(groundtruth)数据。本文采用sift-1M进行解读,且看如下: 1、sift-1m数据集 官方链接地址:Evaluation of Approximate nearest neighbors: large datase…

嵌入式微控制器架构为AI演进

如果您将IoT与AI相结合会得到什么?AIoT是简单的答案,但由于神经网络技术的进步,使机器学习不再局限于超级计算机的世界,因此您还将获得嵌入式微控制器的巨大新应用领域。如今,智能手机应用处理器可以(并且确…

UML 类图的画法

1.类图的画法 类 整体是个矩形,第一层类名,第二层属性,第三层方法。 :public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…