数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行增、删、改、查数据操作。简而言之,存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
InnoDB:MySQL5.7中的默认存储引擎。InnoDB是一个用于MySQL的事务安全(符合ACID标准的)存储引擎,它具有提交、回滚和崩溃恢复功能,以保护用户数据。InnoDB行级锁定(不升级到粗粒度锁定)和oracle风格的一致非锁定读取提高了多用户并发性和性能。InnoDB将用户数据存储在集群索引中,以减少基于主键的常见查询的I/O。为了维护数据的完整性,InnoDB还支持外部KEY引用完整性约束。
MyISAM:这些表的占用空间很小。表级锁定限制了读/写工作负载的性能,因此它经常用于Web和数据仓库配置中的只读或大读的工作负载。
Memory:将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中进行快速访问。这种引擎以前被称为HEAP引擎。它的用例正在减少;InnoDB的缓冲池内存区域提供了一种通用和持久的方式来保存内存中的大多数或所有数据,而NDBCLUSTER为巨大的分布式数据集提供了快速的键值查找。
CSV:它的表实际上是用逗号分隔的值编写的文本文件。CSV表允许您以CSV格式导入或转储数据,以与读取和编写相同格式的脚本和应用程序交换数据。由于CSV表没有被索引,因此通常在正常操作期间将数据保存在InnoDB表中,并且只在导入或导出阶段使用CSV表。
Archive: 这些紧凑的、未建立索引的表,用于存储和检索大量很少引用的历史、归档或安全审计信息。
Blackhole: Blackhole存储引擎接受数据,但不存储数据,类似于Unix /dev/null设备。查询总是返回一个空集。这些表可以用于复制配置,其中将DML语句发送到复制服务器,但源服务器不保留自己的数据副本。
NDB(也称为NDB集群):这个集群数据库引擎特别适合于需要最高可能程度的正常运行时间和可用性的应用程序。
Merge: 允许MySQL DBA或开发人员从逻辑上分组一系列相同的MyISAM表,并将它们引用为一个对象。适用于VLDB环境,如数据仓库。
Federated: 提供链接单独的MySQL服务器,从许多物理服务器创建一个逻辑数据库。非常适合用于分布式或数据集市环境。
Example:此引擎作为MySQL源代码中的一个示例,说明了如何开始编写新的存储引擎。这主要是开发者的兴趣。存储引擎是一个无不作用的“小块”。您可以使用此引擎创建表,但是不能在其中存储或从中检索数据。
使用mysql提供的各种存储引擎的设计考虑到了不同的用例。下表概述了使用mysql提供的一些存储引擎,表后有澄清说明。
特征 | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B树指数 | 是的 | 是的 | 是的 | 不 | 不 |
备份/点时回收(注1) | 是的 | 是的 | 是的 | 是的 | 是的 |
集群数据库支持 | 不 | 不 | 不 | 不 | 是的 |
集群索引 | 不 | 不 | 是的 | 不 | 不 |
压缩数据 | 有(注2) | 不 | 是的 | 是的 | 不 |
数据缓存 | 不 | N/A | 是的 | 不 | 是的 |
加密数据 | 有(注3) | 有(注3) | 有(注4) | 有(注3) | 有(注5) |
外键支持 | 不 | 不 | 是的 | 不 | 是的 |
全文检索索引 | 是的 | 不 | 有(附注6) | 不 | 不 |
地理空间数据类型支助 | 是的 | 不 | 是的 | 是的 | 是的 |
地理空间索引支助 | 是的 | 不 | 有(附注7) | 不 | 不 |
哈希指数 | 不 | 是的 | 否(注8) | 不 | 是的 |
索引库 | 是的 | N/A | 是的 | 不 | 是的 |
锁定粒度 | 表 | 表 | 行 | 行 | 行 |
MVCC | 不 | 不 | 是的 | 不 | 不 |
复制支持(注1) | 是的 | 受限(附注9) | 是的 | 是的 | 是的 |
存储限制 | 256TB | RAM | 64TB | 没有 | 384EB |
T树索引 | 不 | 不 | 不 | 不 | 是的 |
事务/交易 | 不 | 不 | 是的 | 不 | 是的 |
更新数据字典统计数据 | 是的 | 是的 | 是的 | 是的 | 是的 |
注:
1.在服务器中实现,而不是在存储引擎中实现.
2.只有在使用压缩行格式时,才支持压缩MyISAM表。使用压缩行格式的表仅被读取。
3.通过加密功能在服务器上实现.
4.通过加密功能在服务器中实现;在mysql5.7和以后,支持数据终止加密。
5.通过加密功能在服务器上实现;加密的ndb备份到ndb8.0.22;透明的ndb文件系统加密支持在ndb8.0.29和以后。
6.对全文索引的支持可以在mysql5.6及以后使用。
7.对地理空间索引的支持载于mysql5.7及以后。
8.InnoDB内部使用散列索引进行自适应散列索引功能。
9.见本节后面的讨论。
支持事务,支持4个事务隔离级别
MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB
读写阻塞与事务隔离级别相关
能非常高效的缓存索引和数据
表与主键以簇的方式存储
支持分区、表空间,类似oracle数据库
支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
对硬件资源要求还是比较高的场合
行级锁定,但是全表扫描操作仍然会是表级锁定,如update table set a=1 where user like ‘%lic%’;
InnoDB 中不保存表的行数,如 select count() from table;(统计表中所有字段的行数) 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表。
对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引
清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表
业务需要事务的支持
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
业务数据更新较为频繁的场景。如:论坛,微博等
业务数据一致性要求较高。如:银行业务
硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力
MyISAM的特点介绍及数据引擎对应文件
MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
访问速度快,对事务完整性没有要求
MyISAM适合查询、插入为主的应用
MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展分别为:.frm文件(存储表结构的定义)、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名为.MYI(MYIndex)
表级锁定形式,数据在更新时锁定整个表。
数据库在读写过程中相互阻塞。1.会在数据写入的过程阻塞用户数据的读取 2.也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少
MyIAM支持的存储格式:静态表、动态表、压缩表
公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差