注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MySQL存储引擎介绍

MySQL 彭东稳 6959次浏览 已收录 0个评论

内容导航

●存储引擎是什么
●MySQL存储引擎
●MySQL存储引擎操作语句
●存储引擎选择标准

存储引擎是什么?

存储引擎说白了就是如何存储数据,如何为存储的数据建立索引和如何更新,查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

Oracle SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

特别注意:存储引擎时基于表的而不是基于数据库的。

MySQL存储引擎

MySQL支持插件式存储引擎,可以独立到每个表使用不同的存储引擎。其好处就是因为每个存储引擎都有各自的特点,可以根据需求选择。由于MySQL是开源的特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎,也可以修改某一个存储引擎,只要你有能力即可。

这里主要可以了解MyISAM存储引擎和InnoDB存储引擎,另外在MySQL5.5.8中已经使用InnoDB为默认存储引擎了。而在MariaDBRedhat7.0使用)已经把默认表的MyISAM存储引擎换为Aria存储引擎。

MyISAM存储引擎

MyISAM存储引擎是MySQL 5.5.8之前版本的默认存储引擎,MyISAM存储引擎是基于ISAM存储引擎发展起来的。MyISAM支持全文索引、压缩存放、空间索引(空间函数)、表级锁、延迟更新索引键。但是MyISAM不支持事务、行级锁、更无法忍受的是崩溃后不能保证完全恢复(只能手动修复)。

MyISAM存储引擎主要面向OLAP数据库应用,在MySQL 5.0版本之前,其默认支持的表大小为4GB,但从5.1开始支持默认支持256TB的单表大小,这样足以满足一般企业的需求了。

MyISAM存储引擎的表存储成3个文件,文件的名字和表的名字相同。扩展名包含.frm.MYD.MYI。其中:

.frm是表结构文件

.MYD是表数据文件

.MYI是表索引文件

MyISAM存储引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。如插入数据很快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM存储引擎能够实现处理的高效率。如果应用的完整性、并发性要求很低,也可以选择MyISAM存储引擎。

InnoDB存储引擎

InnoDBMySQL数据库的一种存储引擎,其在MySQL5.5.8开始默认使用。InnoDB支持事务、回滚、崩溃修复能力以及采用MVCC事务安全,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键、并支持类似Oracle的非锁定读,即默认读取操作不会产生锁。支持辅助索引、聚簇索引、支持热备、并在1.2版本中开始支持全文索引。

并且实现了SQL标准的4种隔离级别,其默认级别是REPEATABLE READ。并通过一种被称为netxt-key locking的策略来避免幻读。

InnoDB内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读(read ahead),二次写(double write),能够自动在内存中创建hash索引以加速读操作的自适应哈希索引(adptive hash index),以及能够加速插入操作的插入缓冲区(insert buffer)。

InnoDB非常复杂的,不容易理解。如果用到Innodb引擎,应该好好读读innodb事务模型和锁,以及MVCC机制带来的一些微妙的细节之处。作为事务型的存储引擎,innodb通过一些机制和工具支持真正的热备份,OracleMySQL enterprise backupperconaXtrabackup都可以做到这一点。

Maria

Maria存储引擎是新开发的存储引擎,设计目标是MySQL创建者计划用来替代MyISAM的一款引擎。但是MAria支持事务、缓存数据、和索引文件;应用了行级锁,提供了MVCC功能;以及更好的BLOB字符类型的处理性能。在MariaDB中默认库已经使用它替代了MyISAM

ARCHIVE引擎

ARCHIVE,见名之意可看出是归档,所以归档之后很多的高级功能就不再支持了仅支持插入(insert)和查询(select)两种功能, ARCHIVE存储引擎之前还不支持索引(在MySQL5.5以后开始支持索引了),但是它使用zlib算法将数据行进行压缩存储,压缩比一般可达到1:10.所以通常用于做仓库使用。ARCHIVE存储引擎适用于存储日志信息或其他按时间序列实现的数据采集类的应用场景中。

CSV引擎

CSV是将数据文件保存为CSV格式的的文件的,可以方便的导入到其他数据库中去(例如:excel表格,SQLserver等等),由此需要在数据库间自由共享数据时才偶尔建议使用此存储引擎。并且它也不支持索引;个人认为仅适用于数据交换。

Blackhole引擎

BLACKHOME叫做黑洞,也就是说没有存储机制,任何数据都会被丢弃,但是会记录二进制日志。对BLACKHOLE存储引擎的使用包括:

1、转储文件语法的验证。

2、来自二进制日志记录的开销测量,通过比较允许二进制日志功能的BLACKHOLE的性能与禁止二进制日志功能的BLACKHOLE的性能。

3、因为BLACKHOLE本质上是一个“no-op 存储引擎,它可能被用来查找与存储引擎自身不相关的性能瓶颈。

4、复制过滤(复制过滤不管是在主服务器上还是从服务器上都有利弊)

5MySQL复制(中继服务器)中经常用到。但是这种应用方式并不是那么稳健,因此并不推荐使用。

Federated引擎

FEDERATED可以实现跨服务器整理表,简单说就是它可以访问远程服务器上数据的存储引擎,所以说它不再本地创建数据只会自动的建立一个连接到其他服务器上链接,有点类似于代理的功能,默认都是禁用的。

Memory引擎

MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内存来创建表,而且所有数据保存在内存中。数据安全性很低,但是查找和插入速度很快。如果内存出现异常就会影响到数据的完整性,如果重启或关机,表中的所有数据就会丢失,因此基于MEMORY存储引擎的表的生命周期很短,一般都是一次性的。适用于某些特殊场景像查找和映射,缓存周期性的聚合数据等等。

NDB集群引擎

2003年,当时的MySQL AB公司从索尼爱立信公司收购了NDB数据库,NDB存储引擎时一个集群存储引擎,类似于OracleRAC集群,不过于Oracle RAC share everything架构不同的是,其结构是share nothing的集群结构,因此能提供更高的高可用性。NDB的特点是数据全部放在内存中,也可以将非索引数据放在磁盘上,因此主键查找的速度极快。并且通过添加NDB数据存储节点可以线性地提高数据库性能,是高可用、高性能的集群系统。

扩展第三方存储引擎

OLTP(On-Line Transaction Processing联机事务处理系统)类引擎

XtraDBPerconaXtraDB存储引擎是基于InoDB引擎的一个改进版本,以及包含在percona serverMariaDB中。它的改进点主要集中在性能、可测量性和操作灵活性方面。兼容innodb

PBXT:支持ACID事务和MVCC,支持复制,外键约束,而且支持在固态存储(SSD硬盘)上快速存取数据,是一个不错的支持事务的存储引擎,但是此存在的bug已不再修复,被弃用。

TokuDB:图库数据库,在存储海量数据的方面有着MySQL无法比拟的优势,也有MySQL版的,其最大优势支持分形树索引结构,这个结构导致它和缓存无关也就直接导致了就算索引在数据库文件中放不下也不会影响性能。一般只适用于大量插入数据的分析型场景。(注释:这里的图不是照片等,而是复杂数据连接的数据结构。)

列式存储引擎

列式数据库:此种数据库最适合存储大数据,在数据检索上也很好但是在一定程度上需要反关系存储,因此可能无法满足我们关系型数据库范式的概念所以被称为Nosql

Infobright:适合于数十TB的大环境中、支持数据压缩,默认情况下MySQL不支持列式存储功能需要定制。使用者众多,名气很高。

MonetDB:首先,它的存储模型是对数据从垂直方向进行切分;其次,MonetDB是第一个利用CPU缓存对数据的查询进行优化的数据库系统;此外,MonetDB会自动管理和协调索引机制,优化查询效率。目前使用者不是很多。

InfiniDBInfiniDB Community Edition (社区版)提供一个可伸缩的分析型数据库引擎,主要为数据仓库、商业智能、以及对实时性要求不严格的应用而开发。基于 MySQL 搭建。包括对查询、事务处理以及大数据量加载的支持。目前使用者不是很多。

LucidDB:是唯一一款专注于数据仓库和商务智能的开源RDBMS,它使用了列存储架构,支持位图索引,哈希连接/聚合和页面级多版本,大部分数据库最初都注重事务处理能力,而分析功能都是后来才加上去的。相反,LucidDB中的所有组件从一开始就是为满足灵活的需求,高性能数据集成和大规模数据查询而设计的,此外,其架构设计彻底从用户出发,操作简单。目前使用者不是很多。

社区存储引擎(了解)

如果要列举社区提供的所有存储引擎,可能会有两位数,甚至三位数。但是大部分影响力有限,也很少人使用。

Groona:可以精确的实现全文索引引擎,可以替代MyISAM在索引上的特性。

QQGraph:支持图操作,由Open query研发

Sphinx:外在的服务器能够在MySQL基础上为MySQL构建一个高效的全文索引,通过C++研发,MySQL支持一个社区引擎叫SphinxSE,就是让Sphinx直接支持MySQL接口,在MariaDB 5.5.32上被编译支持了。

Spider:支持分片,每一个独立的分片可以实现独立的查询。

VPForMySQL:支持垂直分区,支持更大级别的数据操作更大级别的数据存储。

MySQL存储引擎操作语句

查看数据库可以支持的存储引擎

查看表的结构等信息的若干命令

创建数据库表时设置存储引擎的基本语法

修改存储引擎

然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个INNODB类型的表。

存储引擎选择标准

1)是否需要支持事务?

2)是否需要使用热备?

3)崩溃恢复:能否接受崩溃?

个人建议

存储日志或按时间增长的数据:MyISAMARCHIVE

事务支持:InnoDBXtraDB

论坛应用:InnoDBXtraDB

电商订单:InnoDBXtraDB

数据量大:InfobrightNoSQLSphinx


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)or分享 (0)
关于作者:

您必须 登录 才能发表评论!