MySQL数据库---存储引擎(MyISAM与InnoDB)

前言

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

一、存储引擎概念介绍

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎

  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

  • MySQL常用的存储引擎:
    MyISAM
    InnoDB

-MySQL数据库中的组件,负责执行实际的数据I/O操作

-MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

二、MyISAM

  1. MyISAM介绍
  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

  • 访问速度快,对事务完整性没有要求
    MyISAM 适合查询、插入为主的应用场景

  • MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
    .frm 文件存储表结构的定义
    数据文件的扩展名为 .MYD (MYData)
    索引文件的扩展名是 .MYI (MYIndex)

  • 表级锁定形式,数据在更新时锁定整个表
    数据库在读写过程中相互阻塞: ————》串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
    会在数据写入的过程阻塞用户数据的读取
    也会在数据读取的过程中阻塞用户的数据写入
    特性:数据单独写入或读取,速度过程较快且占用资源相对少

  • MyIsam 是表级锁定,读或写无法同时进行
    好处是:分开执行时,速度快、资源占用相对较少(相对)

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

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

MyISAM存储引擎数据读写都比较频繁场景不适合

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

数据修改相对较少的业务

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

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

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

三、InnoDB

除了 MyISAM 存储引擎,MySQL 中另一个常用的存储引擎是 InnoD

  1. InnoDB 的介绍
  • InnoDB 存储引擎不同于 MyISAM 存储引擎,能够支持事务安全镖(ACID 兼容),具有提交、回滚和崩溃恢复的能力
  • InnoDB 支持行级锁定,并且可以在 SELECT 语句中提供一个与 Oracle 风格类似的非锁定读,也支持 FOREIGN KEY 强制
  • 种种特性使得 InnoDB 存储引擎的多用户部署和性能得以提升
  • InnoDB 存储引擎还支持 SQL 查询中将 InnoDB 类型的表与其他 MySQL 的表类型混合使用,甚至在同一个查询中也可以混合使用
  • InnoDB 是为处理巨大数据量时的最大性能而设计的
  • 它的 CPU 效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的
  • InnoDB 存储引擎被完全与 MySQL 服务器整合,为在内存中缓存数据和索引而维持它自己的缓冲池
    InnoDB 在一个表空间中存储它的表与索引,表空间可以包含数个文件(或原始磁盘分区)
    这与 MyISAM 不同,比如在 MyISAM 表中每个表被存储在分离的文件中
    InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上也无影响
  1. InnoDB的 特点
    支持事务,支持四个事务隔离级别
    行级锁定,但是全表扫描仍然会是标记锁定
    读写阻塞与事务隔离级别相关
    具有非常高效的缓存特性,能缓存索引,也能缓存数据
    表与主键以簇的方式存储
    支持分区、表空间,类似 Oracle 数据库
    支持外键约束,MySQL 5.5 以前不支持全文索引,5.5 版本以后支持
    适合对硬件资源要求比较高的场合
  2. InnoDB 适用的生产场景

根据 InnoDB 的特点,在下面的场景中需要选择适用 InnoDB 存储引擎

  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需要确保查询时通过索引来完成
  • 业务数据更新较为频繁的场景,如论坛、微博等
  • 业务数据一致性要求较高,例如银行业务
  • 硬件设备内存较大,利用 InnoDB 较好的缓存能力来提高内存利用率,减少磁盘 IO 的压力
  1. 企业选择存储引擎的依据

选择哪种存储引擎,应根据企业系统的实际需要,考虑每个存储引擎提供了哪些不同的核心功能及应用的常见
主要依据以下几个方面来决定:

1)存储引擎支持的字段和数据类型
①所有的引擎都支持通用的数据类型,但不是所有的引擎都支持其他的字段类型
②如二进制对象

2)锁定类型
①不同的存储引擎支持不同级别的锁定
②表锁定:MyISAM 支持
③行锁定:InnoDB 支持

3)索引的支持
①建立索引在搜索和恢复数据库中的数据时能够显著提高性能
②不同的存储引擎提供不同的制作索引的技术
③有些存储引擎根本不支持索引

4)事务处理的支持
①事务处理功能提供向表中更新和插入信息期间的可靠性
②可根据企业业务是否要支持事务选择存储引擎

  1. 小结
  • InnoDB 中不保存表的行数,需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可
  • 需要注意的是,当"count( )"语句包含 where 条件时,MyISAM 也需要扫描整个表
  • 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引
  • 清空整个表时,InnoDB 是一行一行的删除,效率非常慢;而MyISAM 则会重建表

四、配置合适的存储引擎

  • 选择了合适的存储引擎之后,就可以修改为相应的存储引擎类型,修改的步骤如下:
    1.查看数据库可配置的存储引擎类型
    2.查看表正在使用的存储引擎类型
    3.配置存储引擎为所选择的类型
  1. 查看数据库可配置的存储引擎类型
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       |


在这里插入图片描述

参数 解释
Engine 当前版本的 MySQL 所支持的引擎类型
Support 对应引擎是否能使用,DEFAULT 指默认值
Comment 存储引擎的简要说明
Transactions 对应引擎是否支持事务
XA 存储引擎是否支持XA事务
Savepoints 存储引擎是否支持保存点
  1. 查看表正在使用的存储引擎类型

2.1 方式一

#####格式
show table status from 库名 where name = '表名'\G;
#加\G能竖向查看,不加则是横向

#例:
mysql> show table status from zone where name='dsj'\G;
*************************** 1. row ***************************
           Name: dsj
         Engine: InnoDB		//引擎为innodb
        Version: 10
     Row_format: Dynamic
           Rows: 6
 Avg_row_length: 2730
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2021-10-24 13:37:02
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.01 sec)

ERROR: 
No query specified

2.2 方式二

use 库名;
show create table 表名;


例:
mysql> use zone;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show create table dsj\G;
*************************** 1. row ***************************
       Table: dsj
Create Table: CREATE TABLE "dsj" (
  "id" int(11) NOT NULL,
  "name" char(10) NOT NULL,
  "score" decimal(5,0) DEFAULT NULL,
  "passwd" char(48) DEFAULT '',
  PRIMARY KEY ("id")
) ENGINE=InnoDB DEFAULT CHARSET=utf8		//引擎为InnoDB
1 row in set (0.00 sec)

ERROR: 
No query specified

  1. 配置存储引擎为所选择的类型

方法一

通过使用 alter table 命令修改

use 库名;
alter table 表名 engine=MyISAM;


例:
mysql> use zone;	
Database changed
mysql> alter table dsj engine=MyISAM;	//设置引擎为MyISAM

mysql> show create table dsj\G;		//查看表结构
*************************** 1. row ***************************
       Table: dsj
Create Table: CREATE TABLE "dsj" (
  "id" int(11) NOT NULL,
  "name" char(10) NOT NULL,
  "score" decimal(5,0) DEFAULT NULL,
  "passwd" char(48) DEFAULT '',
  PRIMARY KEY ("id")
) ENGINE=MyISAM DEFAULT CHARSET=utf8	//引擎已经被修改为
1 row in set (0.00 sec)

ERROR: 
No query specified

方法二
通过修改 MySQL 的配置文件 my.cnf,可以指定 default-storage-engine 选项设置默认的存储引擎

vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB

systemctl restart mysql.service
#一定记得重启服务以让修改的配置生效

#注:此方法只针对新建的表,对以前已存在的表没有影响,即不会修改之前表的存储引擎类别

在这里插入图片描述
方法三
通过使用 create table 创建表时用 engine 指定存储引擎,会使用指定的存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;


#例:
mysql> use zone;	//切换库

mysql> create table lion (name varchar(10),age char(4))engine=myisam;	//创建表指定引擎
Query OK, 0 rows affected (0.00 sec)

mysql> show create table lion\G;	//查看表结构
*************************** 1. row ***************************
       Table: lion
Create Table: CREATE TABLE "lion" (
  "name" varchar(10) DEFAULT NULL,
  "age" char(4) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8		//引擎为myisam
1 row in set (0.00 sec)

ERROR: 
No query specified


总结

  • MyISAM
    不需要事务支持(不支持)
    并发相对较低(锁定机制问题)
    数据修改相对较少(阻塞问题),以读为主
    数据一致性要求不是非常高

  • InnoDB
    需要事务支持(具有较好的事务特性)
    行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
    数据更新较为频繁的场景
    数据一致性要求较高
    硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

  • 两者最大的区别是Innodb支持事务处理与外键和行级锁,而MyISAM不支持

猜你喜欢

转载自blog.csdn.net/weixin_60917414/article/details/131272822