前言:
首先我们需要知道引擎是什么,引擎(Engine)是电子平台上开发程序或系统的核心组件。利用引擎,开发者可迅速建立、铺设程序所需的功能,或利用其辅助程序的运转。一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎,搜索引擎,杀毒引擎等。
数据库存储引擎是数据库底层软组,数据库管理系统(DBMS)使用数据库引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平的功能,使用不同的存储引擎,还可以获得特定的功能(不同的存储引擎采用的底层构架不同,支持的功能不同,主要是底层的算法设计不同)。现在很多的数据库管理系统都支持多种不同的数据引擎。
查看Mysql的存储引擎Mysql给开发者提供了查询存储引擎的功能,使用:
SHOW ENGINES;
使用命令查看Mysql使用的引起,命令的输出为:
从显示出的存储引擎,我们可以看到我们数据库默认的引擎是“InnoDB”,接下来介绍一下Mysql常用的几种数据库存储引擎。
一、InnoDB存储引擎
InnoDB在Mysql官方的解释:InnoDB给Mysql的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供和Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。
InnoDB存储引擎总支持AUTO_INCREMENT。自动增长列的值不能为空,并且值必须唯一,Mysql中规定自增列必须为主键。在插入值的时候,如果自动增长列不能输入值,则插入的值自动增长的值;如果输入的值为0或空(NULL),则插入的值也是增长后的值,如果插入某一个确定的值,且该值在前面没有出现过,就可以直接插入。
InnoDB还支持外键(FOREIGN KEY)。外键所在的表叫做子表,外键所依赖(REFERENCES)的表叫做父表。父表中被子表外键关联的字段必须为主键。当删除、更新父表中的某条消息时,子表也必须有相应的改变,这是数据库的参照完整性规定。
InnoDB中,创建的表的表结构存储在.frm文件中。(*.frm是描述表的结构,*.MYD保存了表的记录的数据记录,*.MYI则是表的索引)
InnoDB存储引擎被完全与Mysql服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓存池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被分离的文件中,InnoDB表可以是任何尺寸,及时在文件尺寸被限制为2GB的操作系统上(InnoDB表最大支持64TB)。
二、MyISAM存储引擎
MyISAM存储引擎不支持事务(事务Transaction,是数据库区别文件系统的重要特征之一,事务会把数据库从一种一致性状态转换成另一种一致性状态转换为另外一种一致性状态。),也不支持外键,访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。但是存在大量并发每个MyISAM在磁盘上存储3个文件,其中文件名和表名都相同,但是扩展名分别为:frm(存储表定义)
MYD(MyData,存储数据)
MYI(MyIndex,存储索引)
数据文件和索引文件可以放置在不同的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,需要在创建表的时候通过DATADIRECTORY和INDEX DORECTORY语句指定,文件路径需要使用绝对路径。(但是一般使用情况都不需要配置)
MyISAM的表还支持3种不同的存储格式:静态(固定长度)表
动态表
压缩表
其中静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。
动态表包含变长字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁到更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
MyISAM的优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。
三、MEMORY存储引擎
使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。
一般在以下几种情况下使用Memory存储引擎:
1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。
2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。
Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在操作符中,也同样不适合用在order by子句中。
总结存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
---------------------
作者:Flame_Dream
原文:https://blog.csdn.net/Future_One/article/details/79452787