MySQL数据库存储引擎MyISAM与InnoDB

news2024/9/20 16:12:51

前言

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.coloradmin.cn/o/1537320.html

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

相关文章

Ribbon知识点

1、通过类实现重写Ribbon规则 1.1注意 这个类一定不能跟启动类放在同一个包下面,不能被componentScan给扫描到。 需要如图放置: 要是被componentScan给扫描到,则会被所有的服务提供方所共享,那么就不能实现指定服务用不同的Ribbo…

权限提升-Windows权限提升篇溢出漏洞宝塔面板BypassCS插件化MSF模块化

知识点 1、Web到Win系统提权-权限差异原因 2、Web到Win系统提权-溢出漏洞(MSF&CS) 3、Web到Win系统提权-集成软件(哥斯拉模块Bypass) 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移…

【Java Web基础】一些网页设计基础(四)

文章目录 1. 做Tab切换2. 下面的内容展示——Card样式3. 采供分类&#xff0c;分类用面包屑导航做4. 出名企业展示&#xff0c;就是普通的图片5. 用热门商品类似的panel做一个农博会展览 1. 做Tab切换 使用BootStrap提供的样式&#xff1a; <ul class"nav nav-tabs&q…

【Linux】系统开启和关闭过程

Linux 系统启动过程 BIOS 自检&#xff1a;在计算机开机时&#xff0c;BIOS 会进行自检&#xff0c;检查硬件设备是否正常。 加载引导程序&#xff1a;BIOS 自检完成后&#xff0c;会加载引导程序&#xff0c;如 GRUB、LILO 等。引导程序会加载内核和初始化 RAM 磁盘&#xff…

005——串口移植(基于鸿蒙liteos-a)

目录 一、 Liteos-a中串口的使用 1.1 内核里打印 1.2 APP控制台 ​编辑 1.2.1 /dev/console 1.2.2 /dev/serial 1.2.3 /dev/uartddev-0 1. 总体介绍 2. device_t 3. drvier_t 4. uartdev_fops 1.2.4 uart_ops 二、 鸿蒙串口内部的一些机制&#xff08;流水账&…

实用福利网站分享

1.http://www.w3school.com.cn w3school&#xff0c;很好的在线web学习网站&#xff0c;免费 2.https://sklearn.apachecn.org sklearn文档&#xff0c;虽然是文档&#xff0c;但能学到很多很多具体的机器学习例子和知识 3.http://www.runoob.com 菜鸟教程&#xff0c;也是…

GTC大会干货:8位大佬对Transformer起源和未来发展的探讨

在2024年的GTC大会上&#xff0c;黄仁勋特邀Transformer机器语言模型的七位创造者&#xff0c;共同探讨Transformer模型的过去、现在与未来。他们一致认为&#xff0c;尽管Transformer已经成为现代自然语言处理领域的基石&#xff0c;但这个世界仍然需要超越Transformer的新颖架…

使用远程工具连接Mysql

&#xff08;若想要远程连接Mysql需要下面解决四个问题&#xff09; 1、目标地址 直接查询 2、端口号 3306 3、防火墙关闭 [rootlocalhost date]# systemctl stop firewalld.service 4、授权mysql数据库root用户权限&#xff08;因为mysql开始不允许其他IP访问&#xff0…

Java 栈与队列

一、栈 在Java中&#xff0c;实现栈有两个方法&#xff1a; Java本身的集合类型Stack类型。Stack集合类型继承于Vector&#xff0c;由于Vector是通过数组实现的&#xff0c;所以Stack集合类型也是通过数组来实现的。借用LinkedList来间接实现栈。LinkedList是双向链表&#x…

【pcolor数据可视化】Matlab vs. Python

1、Matlab代码及结果 代码 clear;clc load(.\nclcolormap.mat)sl [0,50,100,200,500,0]; el [50,100,200,500,1000,200];for i 1:length(sl)file [..\data\static_result\VIS_Min-,num2str(sl(i)),to,num2str(el(i)),_yearly.npy];data readNPY(file);maskreadNPY(.\mas…

2024阿里云服务器99计划优惠活动_开年采购季优惠价格表

2024阿里云开年采购活动3月优惠&#xff0c;99计划云服务器99元一年、免费领取上云扶持优惠券&#xff0c;不只是云服务器、云数据库、存储、云电脑、域名等均有活动&#xff0c;阿里云服务器网aliyunfuwuqi.com整理阿里云开年采购上云无忧活动入口、优惠价格表和优惠券领取详细…

【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}

文章目录 0.对于信号捕捉的理解1.信号处理的时机1.1 何时处理信号&#xff1f;1.2 内核态和用户态1.3 内核态和用户态的切换 2.了解寄存器3.信号捕捉的原理4.信号操作函数4.1sighandler_t signal(int signum, sighandler_t handler);4.2int sigaction(int signum, const struct…

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和 455. 分发饼干题目解法 376. 摆动序列题目解法 53. 最大子数组和题目解法 感悟 455. 分发饼干 题目 解法 class Solution { public:int findContentChildren(vector<int>& g, vec…

大模型时代,5个最顶级的向量数据库

介绍5个向量数据库。 大模型时代&#xff0c;向量数据库彻底的火了&#xff0c;今天我分享业内最频繁使用的向量数据库&#xff0c;更多实践经验&#xff0c;可以文末参加我们的技术落地的讨论&#xff0c;喜欢本文记得收藏、关注、点赞。 1 Chroma 使用ChromaDB构建LLM应用程…

D咖:颠覆传统,重塑无人自助饮品机新篇章

在当今的快节奏社会中&#xff0c;智能科技正在以前所未有的速度渗透到生活的各个方面&#xff0c;从智能手机到智能家居&#xff0c;它们不仅极大地提高了我们的生活效率&#xff0c;也在不断地改善和丰富我们的生活体验。而饮品行业&#xff0c;作为人们日常生活中不可或缺的…

TCP协议的粘包问题解决方式

粘包问题 首先说明一点&#xff0c;TCP有粘包问题&#xff0c;UDP没有粘包问题。 发送端可以是1KB地发送数据&#xff0c;而接收端的应用程序可以2KB地提走数据&#xff0c;当然也有可能一次提走3K或6K数据&#xff0c;或者一次只提走几个字节的数据&#xff0c;也就是说&…

VS Code 跳板机登录服务器(手打密码+秘钥登录)

目录 0.为什么要用跳班机登陆服务器&#xff1f; 1.VS Code插件安装及ssh安装 2.密码链接方式 1&#xff09;添加ssh设置&#xff0c;设置主机 2)设置跳板机 Tips:可以直接通过窗口连接文件管理 3.密钥连接方式&#xff08;更安全更方便&#xff09; 1&#xff09;mac版…

常见优化器对比:梯度下降法、带动量的梯度下降法、Adagrad、RMSProp、Adam

系列文章目录 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》优化算法&#xff08;相关概念、梯度下降法、牛顿法&#xff09; 李沐《动手学深度学习》优化算法&#xff08;经典优化算法&#xff09; 文章目录 系列文章目录一、梯度下降法&#xff08;一…

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…

Transformer学习【从零理解】

Transformer 一、整体框架 二、Encoder 1.输入部分: &#xff08;1&#xff09;Embedding&#xff1a;将输入的词转换为对应的词向量。 &#xff08;2&#xff09;位置编码&#xff1a;因为保证输出时&#xff0c;顺序不会打乱&#xff0c;所以要加入时序信息即位置编码。 公…