Linux_MySQL8存储引擎搬砖实操手册记录

32 篇文章 0 订阅
9 篇文章 0 订阅

Linux_MySQL8存储引擎搬砖实操手册记录

在这里插入图片描述

前言:在温习测试阶段突然一时兴起想了解下存储引擎,所以简单做个记录。在MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB,在5.5 之前默认是MyISAM (ISAM的升级),其之间的区别功能还主要在于支持事务处理、外键约束以及数据安全备份还原层面,适用于需要事务处理、更新删除频繁的应用场景,而MyIsam更倾向适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景。

一、MySQL 数据库存储引擎介绍

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

查询执行过程

存储引擎是MySQL数据库中的一个组件,负责执行实际的数据I/O操作,工作在文件系统之上,数据库的数据会先传到存储引擎,在按照存储引擎的格式,保存到文件系统。

MySQL 整个查询执行过程

• 客户端向 MySQL 服务器发送一条查询请求
• 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进 入下一阶段
• 服务器进行 SQL解析、预处理、再由优化器生成对应的执行计划
• MySQL 根据执行计划,调用存储引擎的 API 来执行查询将结果返回给客户端,同时缓存查询结果

1.2 InnoDB

1)InnoDB 数据库引擎都是造就 MySQL 灵活性的技术的直接产品,这项技术就是 MYSQL++ API。在使用 MYSQL的时候,你所面对的每一个挑战几乎都源于 ISAM 和 MyISAM 数据库 引擎不支持事务处理(transactionprocess)也不支持外键。尽管要比 ISAM 和 MyISAM 引擎 慢很多,但是 InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。 如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中 的一个了。
2)MySQL 官方对 InnoDB是这样解释的:InnoDB 给 MySQL 提供了具有提交、回滚和崩溃 恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB锁定在行级并且也在 SELECT 语句 提供一个 Oracle 风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在 InnoDB 中扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。 InnoDB 也支持 FOREIGNKEY 强制。在 SQL查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型混合起来,甚至在同一个查询中也可以混合。
3)InnoDB是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于磁盘 的关系数据库引擎所不能匹敌的。
4)InnoDB存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据 和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包 含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM表中每个表被存 在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统 上。

1.3 ISAM(Indexed Sequential Access Method)

1)ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把 ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL 能够支持这样的备份应用程序。
2)注意:使用 ISAM时必须经常备份所有实时数据。

1.4 MyISAM

1)MyISAM 是 MySQL 的 ISAM 扩展格式和缺省的数据库引擎。除了提供 ISAM 里所没有的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的 读写操作,其代价是你需要经常运行 OPTIMIZE TABLE 命令,来恢复被更新机制所浪费的 空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的MyISAMPACK 工具。MYISAM 强调了快速读取操作,这可能就是为什 么 MySQL 受到了 WEB开发如此青睐的主要原因:在WEB 开发中你所进行的大量数据操 作都是读取操作。所以,大多数虚拟主机提供商和 INTERNET平台提供商只允许使用 MYISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。
2)注意:MyISAM引擎使用时必须经常使用 Optimize Table 命令清理空间;必须经常备份 所有实时数据。工具有用来修复数据库文件的MyISAMCHK 工具和用来恢复浪费空间的 MyISAMPACK 工具。
3)如果使用该数据库引擎,会生成三个文件:
.frm:表结构信息
.MYD:数据文件
.MYI:表的索引信息

二、MySQL常用存储引擎特点

常用两种存储引擎:MyISAM和InnoDB

2.1 InnoDB特点

  • 支持事务,支持4个事务隔离级别(数据不一致问题)
  • 读写阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 对硬件资源要求还是比较高的场合
  • 行级锁定,但是全表扫描仍然会是表级锁定(select )
  • MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB,5.5之前是默认MyISAM (ISAM)

InnoDB适用生产场景分析

  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成 业务数据更新较为频繁的场景(如:论坛,微博等)
  • 业务数据一致性要求较高(如:银行业务)
  • 硬件设备内存较大,利用Innodb较好的缓存能力来提高内存利用率,减少磁盘I0的压力

2.2 MyISAM特点

  • MyISAM 适合查询、插入为主的应用场景
  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
  • 访问速度快,对事务完整性没有要求 MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为: .frm
  • 文件存储表结构的定义
  • 数据文件的扩展名为 .MYD (MYData)
  • 索引文件的扩展名是 .MYI (MYIndex)
  • 表级锁定形式,数据在更新时锁定整个表
  • 数据库在读写过程中相互阻塞:串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
  • 会在数据写入的过程阻塞用户数据的读取 也会在数据读取的过程中阻塞用户的数据写入
  • 特性:数据单独写入或读取,速度过程较快且占用资源相对少
  • MyIsam 是表级锁定,读或写无法同时进行,但好处是:分开执行时,速度快、资源占用相对较少(相对)

MyISAM表支持3种不同的存储格式:

1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,优点是存储非常迅速,容易缓存,出现故障容易恢复; 缺点是占用的空间通常比动态表多。
2)动态表
动态表包含可变字段(varchar),记录不是固定长度的 优点是占用空间较少 缺点是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。
3)压缩表
压缩表由myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景

  • 公司业务不需要事务的支持
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差
  • MyIsam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

三、InnoDB与MyISAM 区别

在这里插入图片描述

3.1 InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin 和 commit之间,组成一个事务;
3.2 InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM会失败;
3.3 InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而
MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
3.4 InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
3.5 Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;(在MySQL5.7 版本中已经支持全文索引)。

在这里插入图片描述

补充几点执行层面理解:
3.6 统计表行数时
InnoDB 中不保存表的行数,如 select count( ) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count( )语句包含 where条件时 MyISAM 也需要扫描整个表
3.7 建立索引时
对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引
3.8 删除表时
清空整个表时,InnoDB 是一行一行的删除,效率非常慢。 MyISAM 则会重建表(truncate)

四、企业选择存储引擎依据

如何选择:

4.1 是否要支持事务,如果要请选择 innodb,如果不需要可以考虑 MyISAM
4.2 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请 使用 InnoDB。
4.3 系统奔溃后,MyISAM 恢复起来更困难,能否接受;
4.4 MySQL5.5 版本开始 Innodb 已经成为 Mysql 的默认引擎(之前是 MyISAM),说明其优 势是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不会差。

本次测试环境:openEuler23.4+MySQL8.4

五、存储引擎管理

5.1 查看MySQL 数据库中的数据库/表存储引擎

5.1.1 查看系统支持的存储引擎
---查看my.ini或my.cnf 配置文件
default-storage-engine=INNODB
default-storage-engine=MyISAM

---客户端窗口命令查询
show engines;

在这里插入图片描述

5.1.2 查看表使用的存储引擎
方法一:
show create table 表名;
show create table emp;

在这里插入图片描述

方法二:
show table status from 库名 where name='表名'\G
show table status from test231 where name='emp8'\G

在这里插入图片描述

5.2 修改MySQL数据库中的数据库/表存储引擎

5.2.1 修改系统支持的存储引擎

在这里插入图片描述

Windows环境:
# 修改 MySQL的my.ini 配置文件
---默认路径:
C:\ProgramData\MySQL\MySQL Server 8.4

在这里插入图片描述在这里插入图片描述

保存my配置文件后重启MySQL服务后报错“本地计算机上的MySQL84服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”,原因一般为修改MySQL的my.in后报错

在这里插入图片描述

解决方案:
原由:修改mysql配置文件my.ini后文本文档会默认使用UTF-8编码,我们将文件另存为到原路径,使用ANSI编码保存。

在这里插入图片描述

重启mysql服务成功,查看存储引擎已经更新到MyISAM

在这里插入图片描述

Linux环境:
# 通过修改/etc/my.cnf配置文件来指定默认存储引擎并重启服务
vim /etc/my.cnf

在这里插入图片描述

service mysqld restart

在这里插入图片描述
在这里插入图片描述

# 查询当前数据库的默认存储引擎,已更新为MyISAM

在这里插入图片描述

# 进入mysql测试test231库
use test231

在这里插入图片描述

# 注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更原存储引擎
# 新建一个表,默认是MyISAM
create table emp9(id int,name varchar(20));
# 查询新表存储引擎
show create table em9;
# 查询修改前的表存储引擎
show create table emp8;

在这里插入图片描述

5.2.2 修改表使用的存储引擎
方法一:通过 alter table 修改
alter table 表名 engine=MyISAM;

show create table emp;

在这里插入图片描述

alter table emp engine = myisam;
show create table emp;

在这里插入图片描述

搬砖检索:

1、主流的存储引擎技术
MyISAM  Mysql数据库可以指定的存储引擎
InnoDB   Mysql数据库默认

2、MyISAM和InnoDB区别
InnoDB支持事务,而MyISAM不支持事务
InnoDB支持行级锁,而MyISAM支持表级锁
InnoDB支持MVCC,MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB支持全文索引,而MyISAM只支持全文索引

3、查看和修改数据库/表存储引擎的方法
3.1查看引擎
show engines
show table status from 库名 where name='表名'\G

3.2修改数据库/表引擎
通过配置文件/etc/my.cnf修改
vim /etc/my.cnf
-----------------------------------
[mysqld]
default-storage-engine=INNODB
default-storage-engine=MyISAM
-----------------------------------
通过alter table修改
alter table 表名 engine=MyISAM;
-----------------------------------
4、重启服务
service mysqld restart

5、通过create table创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;
  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚊子不吸吸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值