Mysql中的存储引擎详解(整理)

存储引擎:

Mysql中的数据用各种不同的技术(即存储引擎)存储在文件(/或者内存)中,这些技术中的每一种都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的、不同的功能和能力,开发过程中通过选择不同的存储引擎来适应对数据存储、检索等操作过程中对性能和功能的不同需求。

 

关系数据库表示用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,有的表简单,有的表复杂,有的表不用来存储长期数据,有的表读取非常快、但是插入却很差。在实际开发的过程中,我们可以根据对数据处理的需求,选择不同的存储引擎(不同的表类型),从而最大限度地利用Mysql强大的功能。

MySQL 通过show engines;命令可以查看所支持的存储引擎如下:

EngineSupportTransactionsCommentXASavepoints
FEDERATEDNONULLFederated MySQL storage engineNULLNULL
MRG_MYISAMYESNOCollection of identical MyISAM tablesNONO
MyISAMYESNOMyISAM storage engineNONO
BLACKHOLEYESNO/dev/null storage engine(anything you write to it disappears)NONO
CSVYESNOCSV storage engineNONO
MEMORYYESNOHash based, stored in memory useful for temporary tablesNONO
ARCHIVEYESNOArchive storage engineNONO
InnoDBDEFAULTYESSupports transactions, tow-level locking and foreign keysYESYES
PERFORANCE_SCHEMA YESNOPerformance SchemaNONO

InnoDB:

InnoDB是一个健壮的事务性存储引擎,目前MySQL的默认存储引擎,引入了行级锁定和外键约束,提供了事务处理回滚崩溃修复能力多版本并发控制的事务安全。

InnoDB存储引擎支持AUTO_INCREMENT(自动增长)。 (自动增长列的值非空,并且值必须唯一,MySQL中规定自增列必须为主键。在插入时,如果不输入值、或插入为0或NULL,则为自动增长后的值;如果插入某个确定的值,且该值第一次出现,则直接插入)。

InnoDB支持外键(FOREIGN KEY)。外键所在的表为子表,外键所依赖的表为父表。父表中被子表外键所关联的字段必须为主键。参照完整性规则,删除更新父表中的信息时,子表也要有相应的改变。

InnoDB中表结构存储在(.frm)文件中,数据和索引存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中。

InnoDB常用的使用场景:

1.更新密集的表。InnoDB适合处理多重并发的更新请求。

2.事务处理。InnoDB是支持事务的标准MySQL存储引擎。

3.自动灾难恢复。依赖InnoDB的崩溃修复能力。

4.外键约束。MySQL中只有InnoDB支持外键。

5.需要使用自增长AUTO_INCREMENT。

InnoDB的优势在于提供了良好的事务处理崩溃修复能力并发控制,缺点是读写效率较差占用的数据空间相对较大。

 

MyISAM:

MyISAM曾作为MySQL的默认存储引擎,是基于ISAM引擎发展而来的,它将表存储成3个文件,分别是:(1).frm文件(文件存储表的结构)(2)MYD文件(数据存储文件、MYData)(3)MYI文件(索引存储文件、MYIndex)。

基于MyISAM存储引擎的表支持3种不同的存储格式,包括静态型、动态型和压缩型。其中,静态型是MyISAM的默认存储模式,字段是固定长度的,这种方式的优点是存储非常迅速、容易缓存、出现故障容易恢复,缺点是占用的空间比动态表多(静态表存储时会根据列定义的宽度补足空格,但在访问过程中不会得到空格);动态型包含变长字段,记录的长度不是固定的,优点是存储占用空间较少,但是频繁地更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 或 myisamchk -r来改善性能,并且故障恢复较困难;压缩型myisamchk工具创建,占用的空间很小,每条记录单独压缩,访问开支很小

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

 

MEMORY

Memory是MySQL中一类特殊的存储引擎,它使用存储在内存中的内容来创建表,而且数据全部放在内存中。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为.frm类型,该文件中只存储表的结构,而其数据文件,都是存储在内存中,有利于数据的快速处理,提高了整个表的效率。虽然MEMORY会提供很高的性能,但当mysqld守护进程崩溃是,所有的Memory数据都会丢失,获得速度的同时也带来了一些缺陷:它要求存储在MEMORY中的数据使用的是长度不变的格式,因此无法使用BLOB和TEXT这样的长度可变的数据类型(VARCHAR是一种长度可变的类型,但它在MySQL内部被当做长度固定不变的CHAR类型,所以可以使用)

使用MEMORY引擎的场景:

1.目标数据较小,而且被频繁地访问。(会造成内存的使用,可以通过max_heap_table_size控制表的大小)

2.数据时临时的,而且要求立即可用。

3.存储在MEMORY中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

MEMORY使用的场景很少,基于MEMORY的表生命周期很短,一般都是一次性的。

 

ARCHIVE:

Archive是归档的意思,在归档后很多的高级功能就不支持了,仅仅支持最基本的插入和查询两种功能,在MYSQL5.5后ARCHIVE开始支持索引。ARCHIVE拥有很好的压缩机制,使用zlib亚索库,记录被请求时会实时压缩,所以经常被当做仓库使用。

 

 

总结:常用的存储引擎为InnoDB 和MyISAM,可根据项目中的实际使用选择不同的存储引擎,如果需要较高的事务处理,可以选择InnoDB,而对查询要求比较高的则可以选择MyISAM存储,同一个数据库中可以视同多种存储引擎的表。

 

本篇文章参考以下链接整理而成:

1.https://blog.csdn.net/cymm_liu/article/details/45745431

2.http://www.cnblogs.com/yuxiuyan/p/6511837.html

若有侵权,请联系本人删除。

另附InnoDB和MyISAM的具体对比:https://www.cnblogs.com/kevingrace/p/5685355.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值