MySQL存储引擎(表类型)的区别和选择

MySQL存储引擎(表类型)的区别和选择

    • 1. MyISAM
    • 2. InnoDB
    • 3. MEMORY
    • 4. MERGE
    • 5. TokuDB
    • 6. 如何选择

1. MyISAM

MyISAM是MySQL默认的存储引擎,不支持事务、也不支持外键,其优势是访问速度快,对事务完整性没有要求或者以SELECT、INSECT为主的应用基本上都可以使用这个引擎来创建表

每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但扩展名分别是:.frm(存储表定义);.MYD(存储数据);.MYI(存储索引)

MyISAM的表支持3种不同的存储格式,分别是静态表、动态表和压缩表

  1. 静态表是默认的存储格式,表中的字段都是非变长字段,存储非常迅速,容易缓存,出现故障容易恢复;但是占用空间通常比动态表多。静态表在存储时慧按照列的宽度定义补足空格,但是在应用访问时并不会得到这些空格,这些空格在返回给应用之前已经去掉。所以,当需要保存的内容后面本来就带有空格时,在返回结果的时候也会被去掉,开发时需要注意(内容前的空格不会被去掉)
  2. 动态表包含变长字段,占用的空间相对较少,但是频繁更新和删除记录会产生碎片,需要定期执行optimize table语句或myisamchk-r命令来改善性能,并且在出现故障时恢复相对比较困难
  3. 压缩表由myisampack工具创建,占据非常小的空间。因为每个记录是被单独压缩的,所以只有非常小的访问开支

2. InnoDB

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

  1. 自动增长列
    InnoDB的自动增长列可以手工插入,但是插入的值如果是空或是0,则实际插入的将是自动增长后的值。并且,自动增长列必须是索引;如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,插入记录后自动增长列是按照组合索引的前面几列进行排序后递增的

  2. 外键约束
    MySQL支持外键约束的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。因为在插入或删除时的外键约束,必须先删除子表的内容再删除父表,必须先插入父表的内容再插入子表,在导入多个表的数据时,可以通过“SET FOREIGN_KEY_CHECKS = 0;”来暂时关闭外键约束来加快处理的速度,执行完成之后,再执行“SET FOREIGN_KEY_CHECKS = 1;”语句改回原状态

  3. 存储方式
    1) 共享表空间存储
    2) 多表空间存储

3. MEMORY

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

服务器需要足够内存来维持所有在同一时间使用的MEMORY表,当不在需要MEMORY表的内容时,要释放掉表使用的内存

每个MEMORY表中可以放置的数据量的大小受到系统变量的约束(初始值是16MB,可以根据需要加大)

MEMORY主要用于那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果

4. MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,MERGE表本身并没有数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。对于MERGE类型表的插入操作,是通过INSERT_METHOD子句定义插入的表,可以是FIRST/LAST表示相应的插入到第一个表或者最后一个表,不定义这个子句或者定义未NO,表示不能对这个MERGE表执行插入操作

可以对MERGE表进行DROP操作,这个操作只是删除MERGE的定义,对内部的表没有任何影响

5. TokuDB

前面4种都是MySQL自带的存储引擎,除此还有一些常见的第三方引擎,比如列式存储引擎Infobright、高写性能高压缩的TokuDB

TokuDB是一个高性能、支持事务处理的MySQL和MariaDB的存储引擎,具有高拓展性、高压缩率、高效的写入性能,支持大多是DDL操作

  • 使用Fractal树索引保证高效的插入性能
  • 优秀的压缩特性,比InnoDB高近10倍
  • Hot Schema Changes特性支持在线创建索引和添加、删除属性列等DDL操作
  • 使用Bulk Loader达到快速加载大量数据
  • 提供了主从延迟消除技术
  • 支持ACID和MVCC

适用场景:

  • 日志数据,因为日志通常插入频繁且存储量大
  • 历史数据,通常不会再有写入操作,可以利用TokuDB的高压缩特性进行存储
  • 在线DDL较频繁的场景,使用TokuDB可以大大增加系统的可用性

6. 如何选择

  • MyISAM:如果应用是以读操作和插入操作为主,只是很少的更新和删除操作,并且对事务的完整性、并发行要求不是很高,选择MyISAM
  • InnoDB:如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,选择InnoDB,对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB是合适的选择
  • MEMORY:对表的大小有限制,太大的表无法缓存在内存中,其次要确保表的数据可以恢复。通常用于更新不太频繁的小表,用以得到访问结果
  • MERGE:可以突破对单个MyISAM表大小的限制,并且通过不同的表分布在多个磁盘上,可以有效地改善MERGE表的访问效率,这对于诸如数据仓储等VLDB环境十分合适

你可能感兴趣的:(MySQL)