mysql存储引擎

Posted 羽觞醉月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储引擎相关的知识,希望对你有一定的参考价值。

存储引擎的定义

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)通过存储引擎进行创建,删除,修改,查询数据。不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

补充mysql的核心就是存储引擎

 

查看存储引擎

命令show engines (我用的navicat)

 

InnoDB存储引擎

mysql5.5之后默认的存储引擎,是事务型数据库的首选引擎。支持事务安全表(ACID:原子性,一致性,隔离性,持久性)

InnoDB的特性:

  1. 给mysql的表提供了事务处理,回滚,崩溃恢复能力,多版本并发控制的事务安全,InnoDB锁定在行级并且也在SELECT语句中提供一个类似oracle的非锁定读,这些功能增加了多用户部署和性能
  2. InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中
  3. 支持auto_increment,支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
  4. InnoDB里,创建的表的表结构存储在以.frm为后缀的文件中,创建的名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件,存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中
  5. 支持B+树索引,自适应哈希索引,fulltext索引(现在支持了),R-TREE索引(是一种空间索引的数据结构,用于对GIS数据类型创建SPATIAL索引,现在支持了)

补充: 自适应哈希索引: InnoDB引擎会实时监控表上索引的使用情况,如果认为建立hash索引可以提高效率,则自动在内存中的“自适应哈希索引缓存区”中建立hash索引(好厉害的样子)

 

总结: InnoDB的优势在于良好的事务处理能力,崩溃恢复能力和并发控制,缺点是读写效率较差(不包括并发写入),占用的数据空间相对较大

 

MyISAM存储引擎

MyISAM是基于ISAM引擎发展起来的,具有较高的插入,查询速度,但不支持事务

MyISAM的特性:

  1. 当把删除和更新及插入混合的时候,动态尺寸的行更少碎片
  2. 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
  3. BLOB和TEXT列可以被索引
  4. NULL被允许在索引的列中,这个值占每个键的0~1个字节
  5. 所有数字键值以高字节为先被存储以允许一个更高地索引压缩
  6. 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快(至少10%)
  7. 可以把数据文件和索引文件放在不同目录
  8. VARCHAR和CHAR列可以多达64KB
  9. 基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。其中,静态型是MyISAM的默认存储格式,它的字段是固定长度的;动态型包含变长字段,记录的长度不是固定的;压缩型需要用到myisampack工具,占用的磁盘空间较小。
  10. 使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
  11. 支持B+树索引(与InnoDB不同),fulltext索引,R-TREE索引

总结: MyISAM的优势在于占用空间小,处理速度快,缺点是不支持事务的完整性和并发性

 

Memory存储引擎

memory存储引擎是将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问

memory的特性:

  1. 每个基于MEMORY存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型,该文件中只存储表的结构
  2. 数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率
  3. MEMORY不支持BLOB或TEXT列
  4. MEMORY支持AUTO_INCREMENT列对可包含NULL值的列的索引
  5. MEMORY表在所有客户端之间共享(就像其他任何非TEMPORARY表)
  6. 当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROMTRUNCATE TABLE,或者删除整个表(使用DROP TABLE
  7. MEMORY表使用一个固定的记录长度格式
  8. 支持HASH和BTREE索引

总结: MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据,如果重启或者关机,所有数据都会消失,因此,基于MEMORY的表的生命周期很短,一般是一次性的

 

 功能  InnoDB  MyISAN  Memory  Archive
 存储限制  64TB 256TB  RAM  none
 支持事务  YES  NO  NO  NO
 支持全文索引  YES  YES  NO  NO
 支持B树索引  YES  YES  YES  NO
 支持哈希索引  自适应哈希索引  NO  YES  NO
 支持数据缓存  YES  NO  N/A  NO
 支持外键  YES  NO  NO  NO

 

 

 

 

 

 

 

 

 

 

 

总结: 

如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择

如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率

如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

以上是关于mysql存储引擎的主要内容,如果未能解决你的问题,请参考以下文章

MySQL支持的存储引擎

mysql存储引擎

Mysql存储引擎Myisam小结

Mysql存储引擎之myisam

mysql存储引擎

MySQL(十六)—— 存储引擎