MySQL存储引擎概述&MyISAM&InnoDB&MEMORY

版权声明: https://blog.csdn.net/qq_16525279/article/details/82773520

针对不同的存储需求可以选择最优的存储引擎。

概述

插件式存储引擎是MySQL 数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据、是否使用事务等。MySQL 默认支持多种存储引擎,以适用于不同领域的数据库应用需要,用户可以通过选择使用不同的存储引擎提高应用的效率,提供灵活的存储,用户甚至可以按照自己的需要定制和使用自己的存储引擎,以实现最大程度的可定制性。

MySQL 5.0 支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED 等,其中InnoDB 和BDB提供事务安全表,其他存储引擎都是非事务安全表。

创建新表时如果不指定存储引擎,那么系统就会使用默认存储引擎,MySQL5.5之前的默认存储引擎是MyISAM,5.5之后改成了InnoDB。

常用存储引擎的对比

MyISAM

MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT 为主的应用基本上都可以使用这个引擎来创建表。
每个MyISAM 在磁盘上存储成3 个文件,其文件名都和表名相同,但扩展名分别是:

  • frm(存储表定义);
  • MYD(MYData,存储数据);
  • MYI (MYIndex,存储索引)。

数据文件和索引文件可以放置在不同的目录,平均分布IO,获得更快的速度。

要指定索引文件和数据文件的路径,需要在创建表的时候通过DATA DIRECTORY 和INDEXDIRECTORY 语句指定,也就是说不同MyISAM 表的索引文件和数据文件可以放置到不同的路径下。文件路径需要是绝对路径,并且具有访问权限。

MyISAM 类型的表可能会损坏,原因可能是多种多样的,损坏后的表可能不能访问,会提示需要修复或者访问后返回错误的结果。MyISAM 类型的表提供修复的工具,可以用CHECK TABLE 语句来检查MyISAM 表的健康,并用REPAIR TABLE 语句修复一个损坏的MyISAM 表。表损坏可能导致数据库异常重新启动,需要尽快修复并尽可能地确认损坏的原因。

MyISAM 的表又支持3 种不同的存储格式,分别是:

  • 静态(固定长度)表;
  • 动态表;
  • 压缩表。

静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表的数据在存储的时候会按照列的宽度定义补足空格,但是在应用访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。

动态表中包含变长字段,记录不是固定长度的,这样存储的优点是占用的空间相对较少,但是频繁地更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 语句或myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

压缩表由myisampack 工具创建,占据非常小的磁盘空间。因为每个记录是被单独压缩的,所以只有非常小的访问开支。

InnoDB

InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

1. 自动增长列

InnoDB 表的自动增长列可以手工插入,但是插入的值如果是空或者0,则实际插入的将是自动增长后的值。

对于InnoDB 表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM 表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引的前面几列进行排序后递增的。

2. 外键约束

MySQL 支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包RESTRICT、CASCADE、SET NULL 和NO ACTION。其中RESTRICT 和NO ACTION 相同,是指限制在子表有关联记录的情况下父表不能更新;CASCADE 表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL 则表示父表在更新或者删除的时候,子表的对应字段被SET NULL。选择后两种方式的时候要谨慎,可能会因为错误的操作导致数据的丢失。

当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

3. 存储方式

InnoDB 存储表和索引有以下两种方式。

  • 使用共享表空间存储,这种方式创建的表的表结构保存在.frm 文件中,数据和索引保存在innodb_data_home_dir 和innodb_data_file_path 定义的表空间中,可以是多个文件。
  • 使用多表空间存储,这种方式创建的表的表结构仍然保存在.frm 文件中,但是每个表的数据和索引单独保存在.ibd 中。如果是个分区表,则每个分区对应单独的.ibd文件,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件的位置,以此来将表的IO 均匀分布在多个磁盘上。

MEMORY

MEMORY 存储引擎使用存在内存中的内容来创建表。每个MEMORY 表只实际对应一个磁盘文件,格式是.frm。MEMORY 类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH 索引,但是一旦服务关闭,表中的数据就会丢失掉。

每个MEMORY 表中可以放置的数据量的大小,受到max_heap_table_size 系统变量的约束,这个系统变量的初始值是16MB,可以按照需要加大。此外,在定义MEMORY 表的时候,可以通过MAX_ROWS 子句指定表的最大行数。

MEMORY 类型的存储引擎主要用在那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果。对MEMORY 存储引擎的表进行更新操作要谨慎,因为数据并没有实际写入到磁盘中,所以一定要对下次重新启动服务后如何获得这些修改后的数据有所考虑。

参考自:《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》

链接:https://pan.baidu.com/s/1816DObBm9M8aP1amamu-3g 密码:8w8z

猜你喜欢

转载自blog.csdn.net/qq_16525279/article/details/82773520