tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 设计相关

    • 谈谈MySql中索引失效的情况
    • 存储引擎:MyIsam和InnoDB简介
      • 修改默认存储引擎
        • 查看指定表的存储引擎
      • MyISAM
      • Innodb
        • 事务方面
        • 外键方面
        • 索引层面
        • 锁的颗粒度方面
        • 硬盘存储结构
        • 总结
    • 系统中的变量
    • MySql中查看各种参数
    • 建表:选择合适的数据类型
    • 索引的类型与创建、设计原则
    • 跟Redis的数据一致性保证
  • 运行相关

  • 事务相关

  • 表设计实战系列

  • 分库分表

  • 框架使用

  • 常用sql跟关键字

  • 安装与卸载相关

  • 《MySql》笔记
  • 设计相关
EffectTang
2023-10-31
目录

存储引擎: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         |
| ...                | ...     | ...                                                           | ...          | ...  | ...        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
1
2
3
4
5
6
7
8
9
10
11
12

# 修改默认存储引擎

SET default_storage_engine = MYISAM;
1

执行成功后,再通过show engines查看,可以发现,默认的引擎已经变为了MYISAM。不过这种方式,有一个缺点,它只在当前会话中有效,一旦会话结束或重启MySQL服务,设置就会恢复到配置文件中定义的值。

如果你想要永久生效,则需要对配置信息进行修改。

编辑MySql的配置文件,通常是my.cnf(或my.ini)文件。找到以下行,并在下方添加对应配置:

[mysqld]
1

在该行下方添加一下配置:

default-storage-engine=MyISAM
1

接着重启MySql服务器。

sudo systemctl restart mysql
1

# 查看指定表的存储引擎

show create table table_name;
1

使用该命令后,会显示出创建该表时使用的sql语句,从建表语句中我们可以知道该表的存储引擎。

但创建表后,也会遇到修改存储引擎的情况,虽然这种情况很少。但要想,查看表准确的存储引擎,通常建议使用以下命令:

SHOW TABLE STATUS FROM database_name LIKE 'table_name';
1

修改表的存储引擎:(通常是不建议对已有存储引擎的表进行修改的,可能会遇到数据丢失问题)

ALTER TABLE table_mysql ENGINE = Innodb;
1

# 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级别的外键约束
1
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;  -- 当前会话开启外键约束检查
1
2
3
4
5

最后在说下,外键就是在一个表中(子表或从属表)引用了另一个表(父表或主表)中的主键或唯一键。

注意:将一个包含外键的InnoDB表转为MyIsam会失败。

# 索引层面

InnoDB是聚簇索引,而MyIsam是非聚簇索引(按存储位置分类)。

聚簇索引:将数据和索引放在一起存储,索引结构的叶子节点保存了行数据。

非聚簇索引:将数据与索引分开存储,表数据存储顺序与索引顺序无关。

# 锁的颗粒度方面

myisam支持表锁,而innodb不仅支持表锁,还支持行锁。

# 硬盘存储结构

MyISAM对数据的存储是这样的,她为每个表,使用三个独立的文件来存储数据和索引信息:

  1. 数据文件:以表名加上.MYD(MYData)扩展名,用于存储表的实际数据。
  2. 索引文件:以表名加上.MYI(MYIndex)扩展名,用于存储表的索引数据。
  3. 表定义文件:以表名加上.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;”
1
2

# 总结

MyISAM更适合于读取密集型的应用场景,尤其是那些不需要事务支持且数据量相对较小的情况。而InnoDB则更适合于需要事务支持、并发控制和复杂查询的场景,尤其是在高并发读写环境中表现更为出色。

上次更新: 2025/04/23, 16:23:16
谈谈MySql中索引失效的情况
系统中的变量

← 谈谈MySql中索引失效的情况 系统中的变量→

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式