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.mzph.cn/news/763660.shtml

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

相关文章

【LeetCode】--- 动态规划 集训(一)

目录 一、1137. 第 N 个泰波那契数1.1 题目解析1.2 状态转移方程1.3 解题代码 二、面试题 08.01. 三步问题2.1 题目解析2.2 状态转移方程2.3 解题代码 三、746. 使用最小花费爬楼梯3.1 题目解析3.2 状态转移方程3.3 解题代码 一、1137. 第 N 个泰波那契数 题目地址&#xff1a…

苏州城市学院芮国强一行莅临聚合数据走访调研

3月19日,苏州城市学院校党委书记芮国强、校长赵志宏一行莅临聚合数据,就数据科技赋能行业升级展开调研。聚合数据董事长左磊接待来访。 城市学院党委理论学习中心组一行参观了聚合数据展厅,了解了聚合数据的发展历程、数据产品、应用案例、奖…

QT信号和槽机制connect用法

信号与槽机制是绝对不可或缺且常用的&#xff0c;其中的参数一般都会比较简单&#xff0c;bool、int、QString之类的&#xff0c;但当我们想要传递相对比较复杂的参数&#xff0c;例如QVector<int>、QList<QString>&#xff0c;以及一些我们自定义的结构体时&#…

常用的6个的ChatGPT网站,国内可用!

GPTGod &#x1f310; 链接&#xff1a; GPTGod &#x1f3f7;️ 标签&#xff1a; GPT-4 免费体验 支持API 支持绘图 付费选项 &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&#xff0c;包括API接入和绘图支持。用户可以选择免…

【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例

在WPF&#xff08;Windows Presentation Foundation&#xff09;开发中&#xff0c;TextBlock控件是一个常用的元素&#xff0c;用于显示静态或动态文本内容。它提供了丰富的属性和事件&#xff0c;使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…

数理最适化笔记1

1.1数理最适化是什么&#xff1f; 实际的问题通过数学公式表达出来&#xff0c;并且找到最优解的一种方叫做数理最适化。 数理最适化问题通常是 目的函数&#xff0c;和制约条件组成。 数理最适化问题有很多&#xff0c;最基本的叫做 线性最适化问题 eg. minimize 3x4y s.…

深入BEV感知中的魔鬼细节:综述、评估和秘诀

深入BEV感知中的魔鬼细节&#xff1a;综述、评估和秘诀 论文链接&#xff1a;https://arxiv.org/pdf/2209.05324.pdf 学习感知任务的鸟瞰图&#xff08;BEV&#xff09;中的强大表示法是一种趋势&#xff0c;并引起了工业界和学术界的广泛关注。大多数自动驾驶常规方法是在前…

【那些年错过的好书】——TypeScript+Vue.js前端开发从入门到精通

喜欢前端的同学&#xff0c;可以私信我加入学习群&#xff0c;或关注公众号——【前端系列教程】 正文开始 前言推荐理由作者简介书籍特点章节介绍实书示例写在最后 前言 陌生的朋友&#xff0c;你是否曾为前途而迷茫&#xff0c;看不到努力的价值&#xff0c;时常感到焦虑………

一些常用的Python小技巧

python小技巧 使用列表推导式&#xff1a;列表推导式是一种简洁的方式生成新的列表。例如&#xff0c;可以使用列表推导式快速生成一个递增的数字列表&#xff1a;numbers [x for x in range(10)]。 使用enumerate()函数&#xff1a;enumerate()函数用于在迭代过程中同时获取…

linux系统kubernetes的deployment使用

deployment deployment概念示例文件说明deployment可用字段服务暴露 deployment 概念 deployment 》deploy //可以简写kubectl create deployment myweb --imagenginx --dry-run -o yaml > nginx.yaml 创建文件kubectl expose deployment myweb --nameweb-svc --port8…

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍

MySQL中Buffer pool、Log Buffer和redo、undo日志介绍 Buffer Pool 原理MySQL中的内存结构Buffer PoolChange BufferLog Buffer redo和undo日志redo日志为什么需要REDO日志redo log 基本概念redo的组成redo的整体流程redo log的刷盘策略 undo 日志undo log 基本概念undo log的作…

Qt 不同数据类型转换

一.不同类型数据转换示例&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QJsonDocument> #include <QJsonObject> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication::setAttribute…

使用Python的smtplib和email模块实现邮件收发功能

&#x1f4e7; 使用Python的smtplib和email模块实现邮件收发功能 在Python中&#xff0c;smtplib和email模块是处理电子邮件的强大工具。本文将通过多个案例代码&#xff0c;详细介绍如何使用这两个模块来发送和接收电子邮件。&#x1f680; &#x1f528; 环境准备 在开始之…

别踩坑!2024年小红书代写代发机构选择指南!

在小红书平台上&#xff0c;一篇优质的内容往往能迅速吸引用户的关注&#xff0c;为品牌带来不可估量的曝光和转化。然而&#xff0c;对于许多品牌来说&#xff0c;创作高质量的小红书内容并非易事。因此&#xff0c;选择一家专业的小红书代写代发机构成为了不少品牌的明智之选…

【前端Vue】社交信息头条项目完整笔记第2篇:二、登录注册,准备【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配,关于 , 配置文件,封装请求模块。十、用户关…

线程池相关详解

1.线程池的核心参数 线程池核心参数主要参考ThreadPoolExecutor这个类的7个参数的构造函数&#xff1a; corePoolSize核心线程数目 maximumPoolSize最大线程数目&#xff08;核心线程救急线程的最大数目&#xff09; keepAliveTime生存时间:救急线程的生存时间&#xff0c;生…

【Linux中vim系列】如何在vim中检索字符串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

1.2 编译型语言和解释型语言的区别

编译型语言和解释型语言的区别 通过高级语言编写的源码&#xff0c;我们能够轻松理解&#xff0c;但对于计算机来说&#xff0c;它只认识二进制指令&#xff0c;源码就是天书&#xff0c;根本无法识别。源码要想执行&#xff0c;必须先转换成二进制指令。 所谓二进制指令&…

elment-ui el-tabs组件 每次点击后 created方法都会执行2次

先看错误的 日志打印: 错误的代码如下: 正确的日志打印: 正确的代码如下: 前言: 在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if 来进行…

Oh My Bug || PHPmyAdmin导入csv文件时,502报错

解决&#xff1a; 在宝塔面板文件配置中加入一下代码 location / { proxy_pass http://localhost:888; } location /backend-api { rewrite ^/backend-api(.*)$ $1 break; proxy_pass http://你的ip地址; }