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版本之后开始支持
  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值