My SQL 8.0存储引擎解析
MYISAM 存储引擎
MyISAM基于旧的(并且不再可用)ISAM存储引擎,但有许多有用的扩展。
每个MyISAM表被存储在磁盘中的两个文件中。这些文件具有以表名开头的名称,并有一个扩展来指示文件类型。数据文件具有.MyDD(MyDATA)扩展名。索引文件具有.MyI(MyIndex)扩展名。表定义存储在MySQL数据字典中。
MyISAM表具有以下特征
- 所有数据值都先以低字节存储。这使得数据机和操作系统独立。对二进制可移植性的唯一要求是机器使用两个补足符号整数和IEEE浮点格式。这些要求在主流机器中被广泛使用。二进制兼容性可能不适用于嵌入式系统,有时会有特殊的处理器。
- 存储数据低字节没有明显的速度损失;表行中的字节通常是未对齐的,按顺序读取未对齐的字节比按相反顺序读取只需要很少的处理。此外,获取列值的服务器中的代码与其他代码相比不是时间上关键的。
- 所有数字键值首先存储在高字节中,以允许更好的索引压缩。
- 支持大文件的文件系统和操作系统支持大文件(高达63位的文件长度)。
- MyISAM表中有 (232)2 ( 2 32 ) 2 (1.844 e+1)行的限制。
- 每个MyISAM表的最大索引数是64个。
- 每个索引的最大列数为16个。
- 最大密钥长度为1000字节。这也可以通过改变源代码和重新编译来改变。对于密钥长度大于250字节的情况,使用比默认的1024字节更大的密钥块大小。
- 当按排序顺序插入行时(如使用AUTO_INCREMENT列时),索引树被分割,以便高节点只包含一个键。这提高了索引树中的空间利用率。
- 支持每个表的一个AutoPype增量列的内部处理。MyISAM自动更新此列以进行插入和更新操作。这使得AutoType列更快(至少10%)。序列顶部的值在被删除后不会重复使用。(当AUTO_INCREMENT列被定义为多列索引的最后一列时,确实会重用从序列顶部删除的值。)可以使用ALTER TABLE或myisamchk重置AUTO_INCREMENT值。
- 当混合删除与更新和插入时,动态大小行更少碎片化。这是通过自动组合相邻删除块并通过在下一个块被删除的情况下扩展块来完成的。
- MyISAM支持并发插入:如果一个表在数据文件的中间没有空闲块,那么可以在其他线程正在从表中读取的同时向其中插入新行。空闲块可能由于删除行或更新具有比当前内容更多的数据的动态长度行而发生。当所有空闲块用完(填充)时,将来的插入物再次成为并发。
- 可以将数据文件和索引文件放在不同物理设备上的不同目录中,以便使用CREATE TABLE的Data DIRECTORY和INDEX DIRECTORY表选项加快速度。请参阅第131.18节,“创建表语法”。
- 可以对BLB和文本列进行索引。
- 索引列中允许NULL值。每个键需要0到1个字节。
- 每个字符列可以有不同的字符集。
- MyISAM索引文件中有一个标志,指示该表是否正确关闭。如果使用–myisam-.-options选项启动mysqld,MyISAM表在打开时自动检查,如果表没有正确关闭,则修复。
- MyiSAMCHK将表标记为检查,如果您使用-Update状态选项运行表。MyiSAMCHK——快速检查只有那些没有这个标记的表。
- MyiSAMCHK——分析密钥的部分以及整个密钥的存储统计信息。
- MySAMPACK可以打包BLUB和VARCHAR列。
MyISAM还支持以下特征:
- 支持一个真正的VARCHAR类型;VARCHAR列以一个或两个字节存储的长度开始。
- 具有VARCHAR列的表可以具有固定的或动态的行长度。
- 表中VARCHAR和CHAR列的长度的总和可以达到64KB。
- 任意长度唯一约束。
InnoDB 存储引擎
InnoDB是一种通用的存储引擎,它平衡了高可靠性和高性能。在MySQL 8中,InnoDB是默认的MySQL存储引擎。默认情况下,在没有 ENGINE=子句 的情况下发出CREATE TABLE语句将创建一个InnoDB表。
InnoDB引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
在MySQL 8.0 中 InNoDB的增强信息,可以访问下面的URL:
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
两种引擎的选择
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。
Memory 存储引擎
内存存储引擎(以前称为堆)创建具有存储在内存中的内容的专用表。由于数据易受崩溃、硬件问题或电源中断的影响,因此仅将这些表用作临时工作区或从其他表中提取的数据的只读缓存。
何时使用内存或NDB集群
开发人员希望部署使用MEMORY存储引擎来处理重要、高可用性或频繁更新数据的应用程序,应该考虑NDB集群是否是更好的选择。内存引擎的一个典型用例涉及这些特性:
- 涉及诸如会话管理或缓存等瞬态、非关键数据的操作。当MySQL服务器停止或重新启动时,内存表中的数据将丢失。
- 在内存存储中用于快速访问和低延迟。数据卷可以完全存储在内存中,而不会导致操作系统交换虚拟内存页。
- 只读或读取的大部分数据访问模式(有限的更新)。
- NDB群集提供了与具有较高性能级别的MEMORY引擎相同的特性,并提供了MEMORY不可用的附加特性:
- 行级锁定和多线程操作用于客户端之间的低争用。
- 可扩展性,甚至包括混合的语句混合。
- 可选的磁盘备份操作数据持久性。
- 无共享架构和多主机操作,没有单一故障点,启用99.999%的可用性。
- 跨节点的数据自动分发;应用程序开发人员不需要定制自定义的分割或分区解决方案。
- 对内存不支持的可变长度数据类型(包括BLB和文本)的支持。
(完)