MySQL 架构与内部模块(三)

106 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

存储引擎基本介绍

表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由存储引擎决定的,所以也可以把存储引擎叫做表类型。

在 MySQL 里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引擎。

查看存储引擎

查看数据库里面已经存在的表的存储引擎:

show table status from `monomer_order`;

image.png

在 MySQL 里面,我们创建的每一张表都可以指定它的存储引擎,而不是一个数据库只能使用一个存储引擎。存储引擎的使用是以表为单位的(所以叫表类型)。而且,创建表之后还可以修改存储引擎。

默认情况下,每个数据库有一个自己文件夹,以 monomer_order 数据库为例。

show variables like 'datadir';

image.png

任何一个存储引擎都有一个 frm 文件,这个是表结构定义文件。

docker exec -it mysql ls -l /var/lib/mysql/monomer_order/

image.png

不同的存储引擎存放数据的方式不一样,产生的文件也不一样,innodb 是 1 个,memory 没有,myisam 是两个。

存储引擎比较

数据库支持的存储引擎可以用这个命令查看数据库对存储引擎的支持情况:

show engines;

image.png

其中有存储引擎的描述和对事务、XA 协议和 Savepoints 的支持。

XA 协议用来实现分布式事务(分为本地资源管理器,事务管理器)。

Savepoints 用来实现子事务(嵌套事务)。创建了一个 Savepoints 之后,事务就可以回滚到这个点,不会影响到创建 Savepoints 之前的操作。

官网参考click me!

MyISAM(3 个文件)

MySQL 自带的存储引擎,由 ISAM 升级而来。

These tables have a small footprint. Table-level locking limits the performance in read/write workloads, so it is often used in read-only or read-mostly workloads in Web and data warehousing configurations.

应用范围比较小。表级锁定限制了读/写的性能,因此在 Web 和数据仓库配置中,它通常用于只读或以读为主的工作。

特点:

  • 支持表级别的锁(插入和更新会锁表)。不支持事务。

  • 拥有较高的插入(insert)和查询(select)速度。

  • 存储了表的行数(count 速度更快)。

(怎么快速向数据库插入 100 万条数据?我们有一种先用 MyISAM 插入数据,然后修改存储引擎为 InnoDB 的操作。)

  • 适合:只读之类的数据分析的项目。

InnoDB(2 个文件)

dev.mysql.com/doc/refman/…

The default storage engine in MySQL 5.7. InnoDB is a transaction-safe (ACID compliant) storage engine for MySQL that has commit, rollback, and crash-recovery capabilities to protect user data. InnoDB row-level locking (without escalation to coarser granularity locks) and Oracle-style consistent nonlocking reads increase multi-user concurrency and performance.InnoDB stores user data in clustered indexes to reduce I/O for common queries based on primary keys. To maintain data integrity, InnoDB also supports FOREIGN KEY referential-integrity constraints.

最开始是第三方公司为 MySQL 开发的。

mysql 5.7 中的默认存储引擎。InnoDB 是一个事务安全(与 ACID 兼容)的 MySQL存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。InnoDB 行级锁(不升级为更粗粒度的锁)和 Oracle 风格的一致非锁读提高了多用户并发性和性能。InnoDB 将用户数据存储在聚集索引中,以减少基于主键的常见查询的 I/O。为了保持数据完整性,InnoDB 还支持外键引用完整性约束。

特点:

  • 支持事务,支持外键,因此数据的完整性、一致性更高。

  • 支持行级别的锁和表级别的锁。

  • 支持读写并发,写不阻塞读(MVCC)。

  • 特殊的索引存放方式,可以减少 IO,提升查询效率。

  • 适合:经常更新的表,存在并发读写或者有事务处理的业务系统。

Memory(1 个文件)

Stores all data in RAM, for fast access in environments that require quick lookups of non-critical data. This engine was formerly known as the HEAP engine. Its use cases are decreasing; InnoDB with its buffer pool memory area provides a general-purpose and durable way to keep most or all data in memory, and NDBCLUSTER provides fast key-value lookups for huge distributed data sets.

将所有数据存储在 RAM 中,以便在需要快速查找非关键数据的环境中快速访问。这个引擎以前被称为堆引擎。其使用案例正在减少;InnoDB 及其缓冲池内存区域提供了一种通用、持久的方法来将大部分或所有数据保存在内存中,而 ndbcluster 为大型分布式数据集提供了快速的键值查找。

特点:

  • 把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。只适合做临时表。

  • 将表中的数据存储到内存中。

  • 默认使用哈希索引。

CSV(3 个文件)

Its tables are really text files with comma-separated values. CSV tables let you import or dump data in CSV format, to exchange data with scripts and applications that read and write that same format. Because CSV tables are not indexed, you typically keep the data in InnoDB tables during normal operation, and only use CSV tables during the import or export stage.

它的表实际上是带有逗号分隔值的文本文件。csv表允许以csv格式导入或转储数据,以便与读写相同格式的脚本和应用程序交换数据。因为 csv 表没有索引,所以通常在正常操作期间将数据保存在 innodb 表中,并且只在导入或导出阶段使用 csv 表。

特点:不允许空行,不支持索引。格式通用,可以直接编辑,适合在不同数据库之间导入导出。

Archive(2 个文件)

These compact, unindexed tables are intended for storing and retrieving large amounts of seldom-referenced historical,archived, or security audit information.

这些紧凑的未索引的表用于存储和检索大量很少引用的历史、存档或安全审计信息。

特点:不支持索引,不支持 update delete。

不同的存储引擎提供的特性都不一样,它们有不同的存储机制、索引方式、锁定水平等功能。

我们在不同的业务场景中对数据操作的要求不同,就可以选择不同的存储引擎来满足我们的需求,这个就是 MySQL 支持这么多存储引擎的原因。

如何选择存储引擎?

如果对数据一致性要求比较高,需要事务支持,可以选择 InnoDB。

如果数据查询多更新少,对查询性能要求比较高,可以选择 MyISAM。

如果需要一个用于查询的临时表,可以选择 Memory。

如果所有的存储引擎都不能满足你的需求,并且技术能力足够,可以根据官网内部手册用 C 语言开发一个存储引擎:

dev.mysql.com/doc/interna…

按照这个开发规范,实现相应的接口,给执行器操作。

也就是说,为什么能支持这么多存储引擎,还能自定义存储引擎,表的存储引擎改了对 Server 访问没有任何影响,就是因为大家都遵循了一定了规范,提供了相同的操作接口。