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

存储引擎:

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

 

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

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

Engine Support Transactions Comment XA Savepoints
FEDERATED NO NULL Federated MySQL storage engine NULL NULL
MRG_MYISAM YES NO Collection of identical MyISAM tables NO NO
MyISAM YES NO MyISAM storage engine NO NO
BLACKHOLE YES NO /dev/null storage engine(anything you write to it disappears) NO NO
CSV YES NO CSV storage engine NO NO
MEMORY YES NO Hash based, stored in memory useful for temporary tables NO NO
ARCHIVE YES NO Archive storage engine NO NO
InnoDB DEFAULT YES Supports transactions, tow-level locking and foreign keys YES YES
PERFORANCE_SCHEMA  YES NO Performance Schema NO NO

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

猜你喜欢

转载自blog.csdn.net/noob_Cliam/article/details/84582288