2020年5月8日 09:35:45
InnoDB:
MySQL的默认引擎,设计用来处理大量短期(short-lived)事务,5.1之前是MyIsam(不支持事务),由于InnoDB的性能和自动崩溃恢复特性,非事务型存储中也很流行,建议默认InnoDB。
支持热备份,其它存储引擎都不支持。
MyISAM:
支持:全文索引,压缩,空间函数(GIS)
不支持:事务,行级锁,崩溃后安全恢复
适用场景:只读数据,表较小,可忍受修复(repair)
存储详情:表存储在两个文件中:数据文件(.MYD)和索引文件(.MYI),可以存储的行记录数,一般受限于可用的磁盘空间,或者操作系统中单个文件的最大尺寸。
特性:
插入
整张表加锁,读取时,对所有读到的表加共享锁,写入时,加排它锁,在表有读取查询的同时,也可以插入新纪录(并发插入 CONCURRENT INSERT)
修复
手工或者自动执行检查和修复操作,这里的修复和事务恢复和崩溃恢复概念不同,修复可能导致数据丢失,而且很慢
mysql>CHECK TABLE mytable
如果mysql已经关闭
myisamchk
索引
支持全文索引
延迟更新索引键(键( Delayed Key Write)
创建表时,索引数据不会立即写入磁盘,而是内存的键缓存区(in-memory key buffer),当清理缓存区或者关闭表的时候才会写入磁盘,从而大大提升性能,但如果主机奔溃,可能造成索引损坏,这个特性可以单表设置,也可以全局设置
**建议:**某些场景下(如果表在创建并导入数据以后,不会再进行修改操作,这样的表适合采用MyISAM压缩表),如果确实需要修改,先解压缩,修改数据,再次压缩,压缩表
结言:设计简单,数据以紧密格式存储,哎呦还不错哦。但最大的性能问题还是表锁的问题,如果查询长期处locked状态。毫无疑问,表锁罪魁祸首!
Archive 引擎
支持:select 和insert,5.1之前不支持索引
使用场景:适合日志和数据采集类应用,select需要全表扫描,因为数据分析一般需要全表扫描,
有些需要更快速的insert的操作也可以使用
特性:支持行级锁和专用缓冲区,所以支持高并发的插入,
Blackhole引擎
没有任何存储机制,会丢弃所有插入的数据,不做任何保存,但会记录Blackhole表的日志
使用场景:特殊的复制架构和日志审核,但问题比较多,不推荐
CSV引擎
普通的csv文件(逗号分割值的文件)可以作为MySQL的表来处理
不支持:索引
使用场景:可以作为数据交换的引擎机制
评价:非常有用!
Federated引擎
访问其他MySQL服务器的代理。创建远程链接,查询传输到远程执行,提取或发送需要的数据,经常出问题,默认禁用,后来改名:FederatedX
Memory引擎
特点:
支持Hash索引,查询非常快
需要快速访问数据,数据不重要,重启丢失也没关系,比MyISAM快一个数量级,所有数据存在内存中,不需要磁盘I/O,重启后,表结构还在,数据丢失
表级锁,并发写的性能较低,无法取代传统的基于磁盘的表,
临时表的概念:
使用场景:
邮编和省市县的映射表
缓存周期性的聚合数据
保存数据分析产生的中间数据
Merge引擎
来源:MyISAM的变种,Merge表由多个MyISAM表合并的虚拟表,可以用于日志和数据仓库
评价:引入分区后,已经被放弃!
NDB集群引擎
来源:03年,收购索爱而来,开发了NDB集群存储引擎,发展为MySQL集群
第三方引擎:
主要包括三类:OLTP类引擎,面向列的存储引擎,社区存储引擎
Infobright面向列, 为数据分析和数据仓库应用设计
引擎类总结:
需要用到全文索引:考虑InnoDB+Sphinx组合,而不是支持全文的MyISAM
不在乎扩展和并发,不在乎数据丢失,对空间占用过多敏感,选择MyISAM
不是万不得已,不使用混合引擎,有潜在的BUG和边界问题
混合引擎需要考虑的因素:
事务:InnoDB或者XtraFB
不需要事务:MyISAM
在线热备份:InnoDB
崩溃恢复:InnoDB
日志型:MyISAM/Archive
只读或只读型:MuISAM
订单处理:InnoDB
电子公告牌和论坛:count(*)对MyISAM很快,其它就差很多
CD-ROM应用:MyISAM/MyISAM压缩表
大数据量:InnoDB单机3~5TB,继续上升到10TB,需要建立数据仓库,使用Infobright引擎
表引擎的转换(会丢失外键)
安全:mysql> ALTER TABLE mytable ENGINE= InnoDB;
可以使用导入导出的方法,减少转换时间和控制转换过程,也安全!
高效:为了更好地控制转换的过程,可以使用mysqldump工具将数据导出到文件,然后修改文件中CREATETABLE语句的存储引擎选项,注意同时修改表名,因为同一个数据库中不能存在相同的表名,即使它们使用的是不同的存储引擎。同时要注意mysqldump默认会自动在CREATETABLE语句前加上DROPTABLE语句,不注意这一点可能会导致数据丢失。
数据量不大则可以: