详解 MySQL 面试核心知识点

一、常见存储引擎 1.1 InnoDB

InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠、高性能的特点,主要具备以下优势:

DML 操作完全遵循 ACID 模型,支持事务,支持崩溃恢复,能够极大地保护用户的数据安全;

支持多版本并发控制,它会保存数据的旧版本信息,从而可以支持并发和事务的回滚;

支持行级锁,支持类似 Oracle 的一致性读的特性,从而可以承受高并发地访问;

InnoDB 组织数据时默认按照主键进行聚簇,从而可以提高主键查找的效率。对于频繁访问的数据,InnoDB 还会为其建立哈希索引,从而提高等值查询的效率,这也称为自适应哈希索引;

InnoDB 基于磁盘进行存储,所有存储记录按 的方式进行管理。为弥补 CPU 速度与磁盘速度之间的鸿沟,InnoDB 引用缓存池 (Buffer Pool) 来提高数据的整体性能。查询时,会将目标页读入缓存中;修改时,会先修改缓冲池中的页,然后再遵循 CheckPoint 机制将页刷回磁盘。所有缓存页通过最近最少使用原则 ( LRU ) 来进行定期清理。

InnoDB 支持两次写 (DoubleWrite) ,从而可以保证数据的安全,提高系统的可靠性。

一个 InnoDB 引擎完整的内存结构和磁盘结构如下图所示:

https://github.com/heibaiying

1.2 MyISAM

MyISAM 是 MySQL 5.5 之前默认的存储引擎。创建 MyISAM 表时会创建两个同名的文件:

扩展名为 .MYD(MYData):用于存储表数据;

扩展名为 .MYI (MYIndex): 用于存储表的索引信息。

在 MySQL 8.0 之后,只会创建上述两个同名文件,因为 8.0 后表结构的定义存储在 MySQL 数据字典中,但在 MySQL 8.0 之前,还会存在一个扩展名为 .frm 的文件,用于存储表结构信息。MyISAM 与 InnoDB 主要的区别其只支持表级锁,不支持行级锁,不支持事务,不支持自动崩溃恢复,但可以使用内置的 mysqlcheck 和 myisamchk 工具来进行检查和修复。

1.3 MEMORY

MEMORY 存储引擎(又称为 HEAP 存储引擎)通常用于将表中的数据存储在内存中,它具有以下特征:

MEMORY 表的表定义信息存储在 MySQL 数据字典中,而实际的数据则存储在内存空间中,并以块为单位进行划分;因此当服务器重启后,表本身并不会被删除,只是表中的所有数据都会丢失。

MEMORY 存储引擎支持 HASH 索引和 BTREE 索引,默认采用 HASH 索引。

MEMORY 表使用固定长度的行存储格式,即便是 VARCHAR 类型也会使用固定长度进行存储。

MEMORY 支持 AUTO_INCREMENT 列,但不支持 BLOB 列或 TEXT 列。

MEMORY 表和 MySQL 内部临时表的区别在于:两者默认都采用内存进行存储,但 MEMORY 表不受存储转换的影响,而内部临时表则会在达到阈值时自动转换为磁盘存储。

基于以上特性,MEMORY 表主要适合于存储临时数据 ,如会话状态、实时位置等信息。

1.4 CSV

CSV 存储引擎使用逗号分隔值的格式将数据存储在文本文件中。创建 CSV 表时会同时创建两个同名的文件:

一个扩展名为 csv ,负责存储表的数据,其文件格式为纯文本,可以通过电子表格应用程序 (如 Microsoft Excel ) 进行修改,对应的修改操作也会直接反应在数据库表中。

另一个扩展名为 CSM,负责存储表的状态和表中存在的行数。

1.5 ARCHIVE

ARCHIVE 存储引擎默认采用 zlib 无损数据压缩算法进行数据压缩,能够利用极小的空间存储大量的数据。创建 ARCHIVE 表时,存储引擎会创建与表同名的 ARZ 文件,用于存储数据。它还具有以下特点:

ARCHIVE 引擎支持 INSERT,REPLACE 和 SELECT,但不支持 DELETE 或 UPDATE。

ARCHIVE 引擎支持 AUTO_INCREMENT 属性,并支持在其对应的列上建立索引,如果尝试在不具有 AUTO_INCREMENT 属性的列上建立索引,则会抛出异常。

ARCHIVE 引擎不支持分区操作。

1.6 MEGRE

MERGE 存储引擎,也称为 MRG_MyISAM 引擎,是一组相同 MyISAM 表的集合。 ”相同” 表示所有表必须具有相同的列数据类型和索引信息。可以通过 UNION = (list-of-tables) 选项来创建 MERGE 表,如下:

mysql> CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MyISAM; mysql> CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MyISAM; mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2'); mysql> CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT,message CHAR(20), INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

创建表时可以通过 INSERT_METHOD 选项来控制 MERGE 表的插入:使用 FIRST 或 LAST 分别表示在第一个或最后一个基础表中进行插入;如果未指定 INSERT_METHOD 或者设置值为 NO ,则表示不允许在 MERGE 表上执行插入操作。MERGE 表支持 SELECT,DELETE,UPDATE 和 DELETE 语句,示例如下:

mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+ 二、索引 2.1 B+ tree 数据结构

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxpfg.html