MySQL数据库存储引擎MyISAM与InnoDB

前言

MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件,不同的存储引擎提供了不同的功能和特性,可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎:InnoDB、MyISAM、MEMORY、NDB Cluster、CSV、Archive等。这里介绍其中两种常用的引擎:MyISAM 和 InnoDB。

目录

一、存储引擎概念

二、数据写入流程 

三、MyISAM

1. 特点介绍

2. 适用的环境

四、InnoDB

1. 特点介绍

2. 适用的环境

五、管理存储引擎

1. 查看表使用的存储引擎

2. 修改存储引擎

六、MyISAM 和 InnoDB 区别


一、存储引擎概念

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
  • MySQL数据库中的组件,负责执行实际的数据I/O操作
  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

二、数据写入流程 

① 首先,通过执行INSERT语句将数据插入到MySQL数据库中的表中。这个INSERT语句包含要插入的数据值以及目标表的名称。

② 在创建表时,需要选择适合的存储引擎。

③ 当数据被插入到表中时,MySQL通常会将数据首先存储在内存中的数据缓存中。

④ MySQL根据存储引擎的不同,会有不同的策略将数据从内存缓存刷新到磁盘上的数据文件中。

⑤ 一旦数据被成功写入到磁盘中的数据文件,数据就被持久化存储了。 

三、MyISAM

1. 特点介绍

① MyISAM不支持事务,也不支持外键

② 访问速度快

③ 对事务完整性没有要求

④ 在磁盘上存储成三个文件

  • .frm文件存储表定义
  • 数据文件的扩展名为.MYD(MYData)
  • 索引文件的扩展名是.MYI(MYIndex)

⑤ 表级锁定形式,数据更新时锁整表 

  • 表级锁是一种用于控制对整个表的并发访问的锁机制
  • 数据库在读写过程中相互阻塞,串行操作,按照顺序操作,每次读写锁全表
  • 会在数据写入的过程阻塞用户数据的读取
  • 也会在数据读取的过程中阻塞用户的数据写入

⑥ 数据单独写入或读取,速度过程较快且占用资源相对少

⑦ MyIAM支持的存储格式 

  • 静态表:默认的存储格式,字段都是非可变字段(char)、固定长度;存储块,故障易恢复,占用空间多
  • 动态表:包含可变字段(varchar),记录不是固定长度的,占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 optimize table 语句或 myisamchk -r 命令来改善性能,故障恢复相对比较困难
  • 压缩表:由 myisamchk 工具创建,占据非常小的空间

2. 适用的环境

① 公司业务不需要事务的支持 

② 单方面读取或写入数据比较多的业务

③ 不适合数据读写都比较频繁场景

④ 使用读写并发访问相对较低的业务

⑤ 数据修改相对较少的业务

⑥ 对数据业务一致性要求不是非常高的业务

⑦ 服务器硬件资源相对比较差

简而言之:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

四、InnoDB

1. 特点介绍

① 支持4个事务隔离级别

② 行级锁定,但是全表扫描仍然会是表级锁定

  • 行级锁是一种用于控制对数据库表中单行记录的并发访问的锁机制
  • 行级锁类型有:共享锁和排他锁
  • 在需要高并发访问的情况下,行级锁可以提供更好的并发控制,减少锁冲突
  • 在事务中需要对特定行进行读写操作时,可以使用行级锁确保数据的一致性

③ 读写阻塞与事务隔离级别相关

④ 高效的缓存素引和数据

⑤ 表与主键以簇的方式存储

  • 数据行在物理上是按照主键的顺序排列的,而不是按照它们被插入的顺序 

⑥ 支持分区、表空间,类似oracle数据库

⑦ 支持外键约束,5.5后支持全文索引

⑧ 对硬件资源要求较高

2. 适用的环境

① 业务需要事务的支持

② 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成

③ 业务数据更新较为频繁的场景,如:论坛,微博等

④ 业务数据一致性要求较高,如:银行业务

⑤ 硬件设备内存较大,利用Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力

五、管理存储引擎

1. 查看表使用的存储引擎

显示当前MySQL服务器支持的存储引擎列表:

mysql> mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------

方法一:

show table status from 库名 where name='表名'\G;
示例;
mysql> show table status from school where name = 'class'\G;
         Engine: InnoDB           # 存储引擎为 InnoDB

方法二:

use 库名;
show create table 表名;
示例:
mysql> use school;
mysql> show create table class;           # 显示 class 表的详细信息
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |    # 存储引擎为 InnoDB

2. 修改存储引擎

方法一:通过 alter table 修改

use 库名;
alter table 表名 engine = 存储引擎;
示例:
mysql> use school;                         # 切换库 school
mysql> alter table class engine = MyISAM;  # 修改 class 表的存储引擎为 MyISAM
mysql> show create table class;            # 显示 class 表的详细信息
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |     # 存储引擎为 MyISAM,修改前为 InnoDB

方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务

vim /etc/my.cnf
[mysqld]
default-storage-engine=存储引擎;
示例:
[root@localhost ~]# vim /etc/my.cnf
default-storage-engine=MyISAM        # 指定 MySQL 服务器默认使用的存储引擎是 MyISAM
[root@localhost ~]# systemctl restart mysqld.service  # 重启服务

[root@localhost ~]# mysql -u root -p123456
mysql> use school;
mysql> mysql> show table status from school;
+----------+--------+
| Name     | Engine |
+----------+--------+
| class    | MyISAM |    # 除了 class 表前面手动修改了存储引擎,现有其他表均为 InnoDB
| class01  | InnoDB |
| newclass | InnoDB |
| test01   | InnoDB |     
+----------+--------+
mysql> create table class02 (id int,name char(5));  # 新建 class02 表
mysql> show create table class;
 ENGINE=MyISAM DEFAULT CHARSET=utf8 |     # 新建 class02 表存储引擎已默认为 MyISAM

方法三:通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=存储引擎;
示例:
mysql> create table class03 (id int not null,name char(5) not null)engine=CSV;
# 创建表 class03 并指定存储引擎为 CSV
mysql> show create table class03;        # 显示 class02 表的详细信息
) ENGINE=CSV DEFAULT CHARSET=utf8 |      # 存储引擎 CSV

六、MyISAM 和 InnoDB 区别

存储引擎事务支持行级锁外键约束崩溃恢复空间占用全文索引的支持
MyISAM不支持事务,不具备事务的ACID特性使用表级锁不支持恢复方面较弱,容易出现数据损坏相对较小,适合存储大量只读数据支持
InnoDB支持事务,提供了事务的隔离级别,支持事务的回滚和提交支持行级锁支持支持事务的回滚和提交占用更多的空间,因为它支持事务和行级锁5.6.4版本之后开始支持

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

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

相关文章

论文阅读-MIPD:一种用于分布式深度神经网络训练的自适应梯度稀疏化框架

摘要—基于参数服务器架构的异步训练广泛应用于大规模数据集和深度神经网络模型的扩展训练。在大规模分布式深度学习系统中,通信一直被认为是主要瓶颈。最近的研究尝试通过梯度稀疏化和量化方法来减少通信流量。我们发现前期研究存在三个限制。首先,他们…

【基础+进阶】Midjourney订阅看这一篇就够了!Midjourney进阶关键词用法!Midjourney常见问题!

Midjourney进阶关键词用法 1.风格 设计/流派 可以使用一些关键词作为设计流派风格,例如standard,Japanese anime style,Pixar movie style,cyber punk style等 艺术家的姓名 可以使用一些艺术家的姓名作为风格,例如Andy Warhol,Da Vinci等 渲染/照明…

​浅析多模态大模型技术路线梳理

前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…

【系统架构师】-第6章-数据库设计基础知识

1、三级模式-两级映像 外模式:视图、用户与数据库的接口 概念模式:表 内模式:存储方式,索引创建等 1)外模式-模式映射: 视图与表的映射,表数据发生修改,只需要修改映射&#xf…

探索ChatGPT时代下的下一代信息检索系统:机遇与挑战

1 Introduction 2022 年 11 月 30 日,OpenAI 推出了 ChatGPT,这是一款由先进的 GPT3.5 和更高版本的 GPT-4 生成语言模型提供支持的 AI 聊天机器人应用程序。该应用迅速吸引了全球超亿用户,创下了产品快速传播的新纪录。 它能够以对话的方式…

【Linux系统编程】文件系统

进程与文件 当我们对文件进行操作时,文件必须要被加载到内存中,然后CUP从内存中拿到此文件进行操作,没有打开的文件放在磁盘中存储。 文件的打开其实也是设计到内部某个进程。无论是系统调用,还是专有库中的函数,都是…

软考 网络工程师 每日学习打卡 2024/3/22

学习内容 第9章 网络操作系统与应用服务器 本章主要讲解:了Windows和Linux操作系统的基础知识,并详细讲述了常用的各种服务器的 配置方法。这一章的内容主要是在具体操作方面,网络工程师要能够熟练地配置各种网络服务 器,排除网络…

Linux内核编译与安装

Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统。内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制。Linux内核的一大特点就是采用了整体式结构,有很多过程组成,每个过程都可…

hadoop namenode 查看日志里面报错8485无法连接

一、通过日志排查问题: 1、首先我通过jpsall命令查看我的进程,发现namenode都没有开启 2、找到问题后首先进入我的日志目录里查看namenode.log [rootnode01 ~]# /opt/yjx/hadoop-3.3.4/logs/ [rootnode01 ~]# ll [rootnode01 ~]# cat hadoop-root-nam…

手拉手Java爬虫HttpClient

JAVA爬虫 HttpClient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 使用 HttpClient 的 6 个步骤 1. 创建 HttpClient 的实例 2…

环信新版单群聊UIKit集成指南——Android篇

前言 环信新版UIKit已重磅发布!目前包含单群聊UIKit、聊天室ChatroomUIKit,本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界…

【国家计算机二级C语言】高分笔记

二叉树 参考 http://t.csdnimg.cn/ozVwT 数据库 SQL程序语言有四种类型,对数据库的基本操作都属于这四类,它们分别为;数据定义语言(DDL)、数据查询语言(DQL)、数据操纵语言(DML)、数据控制语言…

Day17:LeedCode 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110. 平衡二叉树 给定一个二叉树,判断它是否是 平衡二叉树 平衡二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 思路: 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶…

深度探索:在 Postman 中实现自动化测试的全面指南!

在当今的软件开发过程中,API(应用程序编程接口)的使用变得越来越普遍,API 允许不同系统之间进行通信和数据交换,从而实现复杂的功能和服务集成,为了确保 API 的可靠性和稳定性,自动化测试至关重…

如何利用RunnerGo简化性能测试流程

在软件开发过程中,测试是一个重要的环节,需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是,随着应用程序变得更加复杂和庞大,传统的测试工具在面对比较繁琐的项目时非常费时费力。这时,一些自动化测试…

量子计算+运营优化!IonQ 和 德国DESY 合作提升机场登机口调度效率

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨 沛贤 深度好文:1200字丨8分钟阅读 3月14日,量子计算公司IonQ宣布了与德国电子同步加速器(DESY,德国的大型粒子物理学研…

出现nginx error 问题

报错: Something has triggered an error on your website. This is the default error page for nginx that is distributed with Fedora. It is located /usr/share/nginx/html/50x.html You should customize this error page for your own site or edit the er…

PLC网关在工业自动化领域的作用及如何选择-天拓四方

一、PLC网关在工业自动化领域的重要性和作用 PLC网关在工业自动化领域的重要性和作用不言而喻。作为工业自动化系统的重要组成部分,PLC网关起到了关键的桥梁作用,实现了PLC与其他设备、系统之间的数据传输和通信。 首先,PLC网关的重要性体现…

nodeJs 学习

常用快捷键 二、fs模块 回调函数为空,则表示写入成功! 练习 const fs require(fs); fs.readFile(../files/成绩.txt, utf-8, (err, dataStr) > {if (err) {console.log(读取失败);return err;}console.log(读取成功);const arr dataStr.split( )co…

SpringBoot整合WebService

WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西&…