一、什么是存储引擎
数据库就是一种对数据进行管理和存储的软件,而它能够实现存储和管理数据的原因就是因为存储引擎的存在,存储引擎就是对存储数据、为存储的数据建立索引以及更新、查询数据等技术的实现方法;在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。
二、存储引擎都有哪些特性
存储引擎所处理的事情,其特性可以总结为以下几点:
并发性:能够让应用程序实现颗粒级锁定。
事务支持:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
引用完整性:通过DDL定义的外键,服务器需要强制保持关联数据库的引用完整性。
物理存储:它包括各种各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。
索引支持:不同的应用程序倾向于采用不同的索引策略,每种存储引擎通常有自己的编制索引方法,但某些索引方法(如B-tree索引)对几乎所有的存储引擎来说是共同的。
内存高速缓冲:不同的应用程序对某些高速缓冲策略的效应效果也有所不同。尽管某些内存高速缓冲对所有存储引擎来说是共同的,其它策略可在使用特殊引擎时才唯一定义
性能帮助:包括针对并行操作的多I/O线程,线程并发性,数据库检查点,成批插入处理等。
其他目标特性:可能包括对地理空间操作的支持,对特定数据处理操作的安全限制等。
以上要求会在不同的需求中予以体现,通过单独一个系统实现是不可能的,以上特点有些本身就是相互矛盾的,对以上内容做些选择,形成的存储引擎就是一个插件引擎了,某些特定的需求可以使用。如下图,部分现有的存储引擎以及基本特点:
特点MyisamBDBMemoryInnoDBArchive
存储限制
没有
没有
有
64TB
没有
事务安全
支持
支持
锁机制
表锁
页锁
表锁
行锁
行锁
B树索引
支持
支持
支持
支持
哈希索引
支持
支持
全文索引
支持
集群索引
支持
数据缓存
支持
支持
索引缓存
支持
支持
支持
数据可压缩
支持
支持
空间使用
低
低
N/A
高
非常低
内存使用
低
低
中等
高
低
批量插入的速度
高
高
高
低
非常高
支持外键
支持
三、MySQL中常使用的引擎
1、MyISAM:这种引擎是mysql最早提供的,这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。
压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。
每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:
1.tb_demo.frm,存储表定义;
2.tb_demo.MYD,存储数据;
3.tb_demo.MYI,存储索引。
2、InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
四、MyISAM v.s InnoDB
MyISAM
InnoDB
事务处理方面:
MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持
InnoDB提供事务处理功能,外部键等高级数据库功能
存储文件组成上的区别:
不支持单表一个文件,会将所有的数据和索引内容分别存在两个文件中;
将数据存储在表空间中,表空间由一系列的数据文件组成,由InnoDB管理;
支持每个表的数据和索引存放在单独文件中(innodb_file_per_table);
增删改查操作
MyISAM存储引擎在筛选大量数据时非常迅速,这是他的突出优点
1.如果你的数据执行大量的插入或更新操作,,出于性能方面的考虑,应该使用InnoDB
2.删表时,InnoDB不会重新建立表,而是一行一行的删除。
表的具体行数的保存
MyISAM用一个变量保存了整个表的行数,执行select count(*) from table时只需要读出该变量即可,速度很快;
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。
锁
MyISAM存储引擎只支持表锁
InnoDB提供行锁
主键范围
小
大,最大是MyISAM的2倍。
外键
不提供
提供
全文索引
支持
不支持
GIS数据
支持
不支持
总结:MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力;
InnoDB是一种支持事务的引擎,给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全的(ACID兼容)存储引擎。
五、其它存储引擎特点总结:
1、MEMORY
- 使用该存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。
2、MERGE
- MERGE存储引擎是一组MyISAM表的组合,它可以将一组MyISAM进行合并,如果我们需要对这一组表进行操作时,这一引擎便派上用场了,前提是这些MyISAM表结构必须完全相同。
3、ARCHIVE
- Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。但Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。