MySQL存储引擎
概述
存储引擎是什么?
MySQL中的数据用各种不同的技术存储在文件中,这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,额能够获得额外的速度或功能,改善应用功能。
存储引擎
1.InnoDB
InnoDB是一个健壮的事务性存储引擎,有行级锁定和外键约束,适用于以下场合:
- 更新密集的表。InnoDB存储引擎适合处理多重并发的更新请求。
- 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
- 自动灾难恢复。与其他存储引擎不同,InnoDB表能够自动从灾难中恢复。
- 外键约束。MYSQL支持外键的存储引擎只用InnoDB。
- 支持自动增长列auto_increment属性。
另外,从MySQL5.7开始InnoDB就成为默认的存储引擎。
2.MyISAM
MyISAM表是独立于操作系统的,这说明可以轻松的将其从Windows服务器移植到Linux服务器。每当简历一个MyISAM引擎的表时,就会创建三个文件,文件名是表名,三个文件如下:
- db_name.frm: 存储表定义
- db_name.MYD: 存储数据
- db_name.MYI: 存储索引
MyISAM引擎不支持事务操作(当然,可以在service层根据自己的业务需求进行相应的控制),MyISQM存储引擎适合在以下情况使用:
- 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点
- 插入密集型的表。MyISAM的兵法插入特性允许同时选择和插入书数据。
3.MRG_MyISAM
MRG_MyISAM存储引擎是一组MyISAM表的组合,也就是说它将MyISAM引擎的多个表聚合起来,但是它内部没有数据,真正的数据依然在MyISAM引擎的表中。
例如:同一种类的数据根据时间分为多张表存储,这时查询就会比较麻烦,MRG_MyISAM引擎可以直接将多个表聚合成一个表统一查询。
4.MEMORY
Memory存储引擎的出发点是速度。为了得到最快的响应时间,采用的存储介质是系统内存。虽然在内存中存储表数据回提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。另外,它要求存储在数据表中的数据使用的是长度不变的格式,这意味着不能使用blob和text这样的长度可变的数据类型,varchar是一种长度可变的类型,但因为它在MySQL内部当作长度固定不变的char类型,所以可以使用。
使用Mymory存储引擎的场景:
- 目标数据较小,而且被经常频繁的访问。在内存中存放数据,过太大的数据可能造成内存溢出,可以通过参数max_heap_table_size控制Memory表的大小,限制表的最大大小。
- 如果数据是临时的,而且要求必须立即可用,那么可以放在内存中。
- 存储在Memory表中的数据如果突然丢失,不会对服务器产生实质的负面影响。
5.CSV
csv存储引擎是csv格式文件存储数据。
- 可以将csv文件作为MySQL的表使用,但是不支持索引,不支持分区。
- 因为csv文件格式的原因,所有的字段必须非空。
- 其中的每个数据行占用一个文本行。
因为csv文件可以被Office等软件直接编辑,可能会出现不规则的情况,若出现csv文件中内容损坏的情况,可以使用check table或repair table名零零检查和修复。
6.ARCHIVE
archive是归档的意思,仅仅支持插入和查询两种操作,在MySQL5.5以后支持索引功能,有很好的压缩机制,在记录请求时进行实时压缩,所以经常被当作仓库来使用。适合存储大量的独立的作为历史纪录的数据,拥有很高的插入速度但是对查询的支持比较差。
7.BLACKHOLE
黑洞存储引擎,所有插入的数据不会保存,boackhole引擎表永远保持为空。服务器会记录下Blackhole表的日志,所以可以用于复制数据到备份数据库。
8.PERFORMANCE_SCHEMA
主要用于收集数据库服务器的性能参数。MySQL用户不能创建存储引擎为PERFORMANCE_SCHEMA的表。
他提供了以下的功能:
- 提供进程等待的详细信息,包括锁、互斥变量、文件信息。
- 保存历史的事件汇总信息,为Mysql服务器的性能做出详细的判断。
- 对于新增和删除监控时间点都非常容易,并可以随意的改变Mysql服务器的监控周期
9.其他
当然还有其它一些存储引擎,如FEDERATED、OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE等。
常用引擎对比
不同的存储引擎有各自的特点,根据实际情况选择合适的存储引擎,其对比如下图所示:
MySQL操作
查看支持的存储引擎:
show engines;
show engines\G;
查看mysql存储引擎系统变量:
修改数据库引擎:
方式一:
修改配置文件my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,将数据库默认引擎修改为InnoDB。
方式二:
在建表是指定存储引擎:
指定test表的存储引擎为MyISAM。
方式三:
建表后更改:
更改该表的存储引擎为InnoDB。
查看表使用的存储引擎:
该如何选择合适的存储引擎呢?提供以下几个选择的标准,实际情况灵活选择:
- 是否需要支持事务
- 是否需要使用热备
- 崩溃恢复,能否接收崩溃
- 是否需要外键支持
- 存储的限制
- 对索引和缓存的支持