存储引擎:
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