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

目录

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

2. InnoDB 引擎概述

3. MyISAM 引擎概述

4. InnoDB 与 MyISAM 的一些区别


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 则是只锁我们链表的头节点,对其他哈希桶位元素的操作不影响,能够适应多线程并发操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具,是Java方法级别的mock,操作就是监听指定方法,返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术,将原始方法…

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…

文本分类实战-NLP

数据集及任务分析 项目主题&#xff1a;新闻的主题分类&#xff0c;10分类任务 一般对于NLP项目来说的话需要进行数据预处理的&#xff0c;但是由于本项目的数据是经过处理过的&#xff0c;所以就不需要进行数据预处理了&#xff0c;但是数据预处理对NLP项目是重中之重的。 TH…

【Linux】高级IO

目录 IO的基本概念 钓鱼五人组 五种IO模型 高级IO重要概念 同步通信 VS 异步通信 阻塞 VS 非阻塞 其他高级IO 阻塞IO 非阻塞IO IO的基本概念 什么是IO&#xff1f; I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在著名的冯诺依曼体系结构当中…

Python-OpenCV中的图像处理-视频分析

Python-OpenCV中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆点&#xff08;比如直方 图反向投影得到的点&…

低代码开发工具:JVS轻应用之间如何实现数据的调用?

在低代码开发平台中&#xff0c;如何实现应用之间的数据共享呢&#xff1f;最标准的方式是通过接口&#xff0c;本文介绍JVS轻应用如何实现将数据通过API输出、轻应用如何实现体内API数据的获取&#xff1f;实现方式如下图所示&#xff0c;不管是数据提供方&#xff0c;还是数据…

接口测试常用代理工具

些代理工具可以帮助我们构造各种测试场景、以及更好的完成测试工作。下面的介绍以 Charles 为主。 Charles Charles 是一款代理服务器&#xff0c;可以截取请求和响应达到分析抓包的目的&#xff0c;且支持多平台&#xff0c;能够在 Windows&#xff0c;Mac&#xff0c;Linux…

Spring Boot 集成 XXL-JOB 任务调度平台

一、下载xxl-job并使用。 二、将xxl-job集成到springboot里 一、 下载xxl-job并使用。 这一步没完成的请参考这个博客&#xff1a;http://t.csdn.cn/lsp4r 二、将xxl-job集成到springboot里 1、引入依赖 <dependency><groupId>org.springframework.boot</group…

Stable Diffusion +EbSynth应用实践和经验分享

Ebsynth应用 1.安装ffmpeg 2.安装pip install transparent-background,下载模型https://www.mediafire.com/file/gjvux7ys4to9b4v/latest.pth/file 放到C:\Users\自己的用户名.transparent-background\加一个ckpt_base.pth文件 3.秋叶安装ebsynth插件,重启webui 填写项目基本…

CSDN编程题-每日一练(2023-08-14)

CSDN编程题-每日一练&#xff08;2023-08-14&#xff09; 一、题目名称&#xff1a;小股炒股二、题目名称&#xff1a;王子闯闸门三、题目名称&#xff1a;圆小艺 一、题目名称&#xff1a;小股炒股 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …

开学季电容笔怎么选?iPad第三方电容笔了解下

不少的学生党开学必备清单里都少不了电容笔&#xff0c;可见其的重要性。自从苹果发布了ipad的原装电容笔以来&#xff0c;这款电容笔在目前市面上就一直很受欢迎&#xff0c;不过由于Apple Pencil的售价实在是太贵了&#xff0c;使得大部分人都买不起。于是&#xff0c;市面上…

Android中tools属性的使用

参考&#xff1a; 1.Android:Tools命名空间原来是有大用处的 2.Android中tools属性的使用 3.工具属性参考文档 4. 命名空间介绍 5. 注解 6. lint 7. 资源压缩shrink-resources 目录 一、概述二、引入tools命名空间三、tools 命名空间的作用有哪些&#xff1f;四、tools 命名空间…

面试热题(数组中的第K个最大元素)

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 输入: [3,2,1,5,6,4] 和 k 2 输出: 5提到数组中最大元素&#xff0c;我们往往想到就是先给数组…

【Linux初阶】system V消息队列 + system V信号量

文章目录 一、system V消息队列&#xff08;了解&#xff09;二、system V信号量&#xff08;了解&#xff09;1.信号量是什么2.临界资源和临界区3.互斥4.为什么要信号量 三、IPC资源的组织方式结语 一、system V消息队列&#xff08;了解&#xff09; 消息队列提供了一个从一…

聊聊JDK1.0到JDK20的那些事儿 | 京东云技术团队

1.前言 最近小组在开展读书角活动&#xff0c;我们小组选的是《深入理解JVM虚拟机》&#xff0c;相信这本书对于各位程序猿们都不陌生&#xff0c;我也是之前在学校准备面试期间大致读过一遍&#xff0c;emm时隔多日&#xff0c;对里面的知识也就模糊了。这次开始的时候从前面…

在Java中对XML的简单应用

XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…

nginx keepalived 本地二进制部署

文章目录 安装 nginx安装 keepalived卸载 nginx卸载 keepalived 安装 nginx wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -xf nginx-1.24.0.tar.gz cd nginx-1.24.0/ ./configure --with-stream --prefix/usr/local/nginx make && make install修改nginx…

使用 VScode 开发 ROS 的Python程序(简例)

一、任务介绍 本篇作为ROS学习的第二篇&#xff0c;是关于如何在Ubuntu18.04中使用VSCode编写一个Python程序&#xff0c;输出“Hello&#xff01;”的内容介绍。 首先我们来了解下ROS的文件系统&#xff0c;ROS文件系统级指的是在硬盘上ROS源代码的组织形式&#xff0c;其结构…

华为OD机试 - 查找众数及中位数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

变压器故障诊断(python代码,逻辑回归/SVM/KNN三种方法同时使用,有详细中文注释)

代码运行要求&#xff1a;tensorflow版本>2.4.0,Python>3.6.0即可&#xff0c;无需修改数据路径。 1.数据集介绍&#xff1a; 采集数据的设备照片 变压器在电力系统中扮演着非常重要的角色。尽管它们是电网中最可靠的部件&#xff0c;但由于内部或外部的许多因素&#…