存储引擎:MyIsam和InnoDB简介
# 存储引擎:MyIsam和InnoDB简介
MySQL 5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。通过以下命令可以进行查看与修改数据库的默认引擎。
show engines;
# 查看所有可用的存储引擎以及哪一个被标记为默认。
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| ... | ... | ... | ... | ... | ... |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
2
3
4
5
6
7
8
9
10
11
12
# 修改默认存储引擎
SET default_storage_engine = MYISAM;
执行成功后,再通过show engines
查看,可以发现,默认的引擎已经变为了MYISAM。不过这种方式,有一个缺点,它只在当前会话中有效,一旦会话结束或重启MySQL服务,设置就会恢复到配置文件中定义的值。
如果你想要永久生效,则需要对配置信息进行修改。
编辑MySql的配置文件,通常是my.cnf(或my.ini)
文件。找到以下行,并在下方添加对应配置:
[mysqld]
在该行下方添加一下配置:
default-storage-engine=MyISAM
接着重启MySql服务器。
sudo systemctl restart mysql
# 查看指定表的存储引擎
show create table table_name;
使用该命令后,会显示出创建该表时使用的sql语句,从建表语句中我们可以知道该表的存储引擎。
但创建表后,也会遇到修改存储引擎的情况,虽然这种情况很少。但要想,查看表准确的存储引擎,通常建议使用以下命令:
SHOW TABLE STATUS FROM database_name LIKE 'table_name';
修改表的存储引擎:(通常是不建议对已有存储引擎的表进行修改的,可能会遇到数据丢失问题)
ALTER TABLE table_mysql ENGINE = Innodb;
# MyISAM
在MySQL 8.0中,尽管InnoDB已经成为默认的存储引擎,但MyISAM仍是一个简单的、高效的存储引擎。
尽管它不支持外键,也不支持事务,但它的访问速度却很快,尤其是在读取密集型的应用场景中,它的速度快,因为MyISAM它使用的是表锁(Tables Locks),这意味着多个读取操作可以同时进行,不会阻塞。如果对事务完整性没有要求或者以select、insert为主的应用可以使用这个引擎来建表。
# Innodb
InnoDB是一个高度可靠的事务性存储引擎,被广泛应用于MySQL数据库管理系统中。自MySQL 5.5版本开始,InnoDB成为了MySQL的默认存储引擎。它是支持事务的存储引擎。
相比MyISAM,它的锁更细。InnoDB除了支持表锁,它还支持行级锁定,这意味着在并发事务中可以实现更高程度的并发控制,多个事务可以同时读取或修改不同的行而不互相阻塞。
# 事务方面
InnoDB支持事务,而MyIsam不支持事务。
ACID(原子性、一致性、隔离性、持久性)是事务的四大特性。
# 外键方面
InnoDB支持外键,而MyIsam不支持。
外键一定程度上保护了多表之间的关联性,但有时它也会带来使用上的一些不便,比如在导入数据表时,如果多个表之前存在外键约束,则对导入表的顺序也会有要求。因此,有时我们会根据需求来关闭外键约束的检测,从而提高效率。
show variables like 'foreign_key_checks';
# 查看当前外键约束检测 是否开启 on则为开启 默认查看的是session级别的外键约束
2
如果要关闭也很简单:
SET GLOBAL foreign_key_checks = 0; -- 关闭外键约束检查
SET GLOBAL foreign_key_checks = 1; -- 开启外键约束检查
SET SESSION foreign_key_checks = 0; -- 当前会话关闭外键约束检查
SET SESSION foreign_key_checks = 1; -- 当前会话开启外键约束检查
2
3
4
5
最后在说下,外键就是在一个表中(子表或从属表)引用了另一个表(父表或主表)中的主键或唯一键。
注意:将一个包含外键的InnoDB表转为MyIsam会失败。
# 索引层面
InnoDB是聚簇索引,而MyIsam是非聚簇索引(按存储位置分类)。
聚簇索引:
将数据和索引放在一起存储,索引结构的叶子节点保存了行数据。
非聚簇索引
:将数据与索引分开存储,表数据存储顺序与索引顺序无关。
# 锁的颗粒度方面
myisam支持表锁,而innodb不仅支持表锁,还支持行锁。
# 硬盘存储结构
MyISAM对数据的存储是这样的,她为每个表,使用三个独立的文件来存储数据和索引信息:
- 数据文件:以表名加上
.MYD
(MYData)扩展名,用于存储表的实际数据。 - 索引文件:以表名加上
.MYI
(MYIndex)扩展名,用于存储表的索引数据。 - 表定义文件:以表名加上
.frm
(Form)扩展名,存储表的结构定义。
而Innodb则要稍微复杂一点,了解它之前你要先学习一个新的概念——表空间
。
表空间
:InnoDB 中的表空间(Tablespace)是一个逻辑概念,用于组织和管理存储在磁盘上的数据和索引。表空间是 InnoDB 存储引擎的最高层级存储单元,它由一个或多个磁盘文件组成,这些文件构成了一个虚拟的文件系统,用于存储 InnoDB 表的数据、索引以及其它内部结构。InnoDB 使用表空间来抽象底层的物理文件,允许数据和索引的高效管理。
了解表空间后,我们继续看Innodb的存储。
InnoDB存储引擎提供了两种不同的表空间管理策略:共享表空间(Shared Tablespaces)
和独立表空间(Separate or Individual Tablespaces)
,也称为多表空间存储。
使用共享表空间存储,这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir 和innodb_data_file_path定义的表空间中,可以是多个文件。总结下就是:数据和索引被存储在一个或多个共享的表空间文件中。
ibdata1
:这是默认的共享表空间文件,InnoDB在初始化时会创建它。它包含了所有的用户数据、索引数据以及InnoDB内部的一些数据结构,如系统表空间、undo段、插入缓冲和自适应哈希索引等。额外的共享表空间文件:通过
innodb_data_file_path
配置参数,可以定义更多的共享表空间文件。这些文件可以分布在不同的磁盘上,以实现I/O负载均衡。
使用多表空间存储,这种方式创建的表的表结构仍然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd 中。如果是个分区表,则每个分区对应单独的.ibd 文件,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表的IO均匀分布在多个磁盘上。
多表空间的数据文件没有大小限制,不需要设置初始大小,也不需要设置文件的最大限制、扩展大小等参数。 对于使用多表空间特性的表,可以比较方便地进行单表备份和恢复操作,但是直接复制.ibd文件是不行的,因为没有共享表空间的数据字典信息,直接复制的.ibd文件和.frm文件恢复时是不能被正确识别的,但可以通过以下命令:
ALTER TABLE tbl_name DISCARD TABLESPACE;
ALTER TABLE tbl_name IMPORT TABLESPACE;”
2
# 总结
MyISAM
更适合于读取密集型的应用场景,尤其是那些不需要事务支持且数据量相对较小的情况。而InnoDB
则更适合于需要事务支持、并发控制和复杂查询的场景,尤其是在高并发读写环境中表现更为出色。