什么是MySQL数据存储引擎
一、 概念:
1. 什么是存储引擎?
MySQL的存储引擎是MySQL体系架构中的重要组成部分,也是MySQL体系结构的核心,插件式的存储引擎更是它区别于其它数据库的重要特征。它处于MySQL体系架构中Server端底层,是底层物理结构的实现,用于将数据以各种不同的技术方式存储到文件或者内存中,不同的存储引擎具备不同的存储机制、索引技巧和锁定水平。
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。 MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
MySQL数据库的存储引擎是插件式的,本身MySQL已经提供了一系列的存储引擎,本文主要是介绍自带引擎的一些特性,有个需要注意的是,存储引擎是基于表格的,而不是数据库,就是说不能说某个数据库是什么引擎,而是某张表是什么存储引擎。
作用
关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎(或者说不通的表类型),我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。
InnoDB:默认的MySQL插件式存储引擎,用于事务处理应用程序,具有众多特性,包括ACID事务支持。
MyISAM:它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。
Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。
CSV : 引用由逗号隔开的用作数据库表的文件。
Blackhole:用于临时禁止对数据库的应用程序输入。
二、存储引擎
1.我们常用的存储引擎
① InnoDB存储引擎
从MySQL数据库5.5.8版本开始,默认存储引擎是InnoDB,InnoDB一个最亮丽的特点就是支持事务,这个是以前旧的默认引擎MyISAM所不具备的。除此之外还有一些行锁设计、支持外键、并发控制等特性。在InnoDB里面,表的存储都是按照主键的顺序进行存放,如果没有显式地显示定义主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。
InnoDB提供了4种事务隔离级别,分别是:未提交读(Read uncommitted)、已提交读(Read committed)、可重复读(Repeatable read)、可串行化(SERIALIZABLE)。
innodb具有以下优点
灾难恢复性好
支持事务,默认的事务隔离级别是可重复读,其事务控制是通过多版本并发控制来实现的。
使用行级锁
对于InnoDB引擎中的表, 其数据的物理组织形式是簇表(Cluster Table) , 数据按主键来组织, 也就是说主键索引和数据是在一起的, 数据按主键的顺序物理分布。 数据表的另一种常见形式是非簇表, 其索引是有序的, 而数据是无序的。
实现了缓冲管理, 不仅能缓冲索引也能缓冲数据, 并且会自动创建散列索引以加快数据的获取。 相比之下, MyISAM只是缓存了索引。(缓冲管理是指在项目执行过程中对于计划阶段设定缓冲的消耗和补充的跟踪和评估。其目的是为项目提供一个简单,易用的项目健康状态视图。这个项目状态会和项目计划和前期承诺进行比较,当出现较大的偏差的时候即需要采用相关的纠正行动。)
支持外键。
支持热备份(热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法。即热备份是系统处于正常运转状态下的备份。)
使用表空间数据存储
innodb_file_per_table
on:独立表空间
off:系统表空间
比较:
系统表空间无法简单的收缩文件大小
系统表空间会产生IO瓶颈:独立表空间可以向对多个文件刷新数据
② MyISAM存储引擎
MyISAM存储引擎
在MySQL 5.5.8以前的版本默认存储引擎是MyISAM,但是MyISAM不支持事务、行锁等特性。MyISAM存储引擎表有MYD和MYI两个文件组成,MYD用来存放数据内容,MYI用来存储索引内容。总体来讲,MyISAM适合那些对数据管理比较简单的场景。
可以配合锁, 实现操作系统下的复制备份、 迁移。
使用表级锁, 并发性差。
支持全文检索(MySQL InonoDB在5.6以后也支持全文检索) 。
主机宕机后, MyISAM表易损坏, 灾难恢复性不佳。
无事务支持。
只缓存索引, 数据的缓存是利用操作系统缓冲区来实现的。 可能引发过多的系统调用且效率不佳。
数据紧凑存储, 因此可获得更小的索引和更快的全表扫描性能。
1.MySAM存储引擎有MYD和MYI组成
2.特性:
并发性和锁级别:对于读写操作是互斥的
表损坏修复:
支持索引
支持数据压缩
3.适合场景:
非事务型应用:
对于只读的报表(可以压缩)
空间函数:gps
③ Memory存储引擎
Memory存储引擎
Memory存储引擎(以前叫HEAP存储引擎)顾名思义,这个引擎是把存储内容放在内存里面的,如果数据库或者服务器崩溃了,那么内存数据都会丢失。它只适合用来存放一些临时非重要数据。
MEMORY存储引擎提供“内存”表, 也不支持事务、 外键。
使用内存表(内存引擎) 可以显著提高访问数据的速度, 可用于缓存会频繁访问的、 可以重构的数据、 计算结果、 统计值、 中间结果, 但也有如下这些不足之处。
使用的是表级锁, 虽然内存访问快, 但如果频繁地读写, 表级锁可能会成为瓶颈所在。
只支持固定大小的行。 VARCHAR类型的字段会存储为固定长度的CHAR类型, 浪费空间。
不支持TEXT、 BLOB字段。 当有些查询需要使用到临时表(使用的也是MEMORY存储引擎) 时如果表中有TEXT、 BLOB字段, 那么会转化为基于磁盘的MyISAM表, 严重降低性能。
由于内存资源成本昂贵, 一般不建议设置过大的内存表, 如果内存表满了, 就会在MySQL错误日志里发现类似“Thetable‘table_name’is full”这样的错误, 可通过清除数据或调整内存表参数来避免报错。
服务器重启数据会丢失
④ ARCHIVE存储引擎
ARCHIVE引擎
ARCHIVE存储引擎是被设计用来存储企业中的大量流水数据的存储引擎。 ARCHIVE引擎使用zlib无损数据压缩, 让数据都保存在压缩的存档表中。 当数据被插入时, 它们被压缩。
它只支持INSERT和SELECT, 支持自增键及其上的索引, 不支持其他索引。 它适合做日志记录、 用户行为分析, 不需要UPDATE、 DELETE和索引的数据
mysql的存储引擎有很多,我们在实际使用的过程需要按照自己的需求去选择,选择的时候需要考虑以下因素
是否需要事务支持。
是否为高并发, InnoDB实现了行锁, 这方面的表现大大优于MyISAM。
索引, 不同存储引擎的索引实现不尽相同。
是否需要外键。
高效缓冲数据, InnoDB缓冲数据而MyISAM只缓冲了索引。
备份, 是否需要支持热备份。
不常用的存储引擎
Federated存储引擎
Federated这个引擎比较有意思,它并不存放数据,而是指向一台远程MySQL数据库上的表,这个特性比较适合用来做数据库的网关或者接入服务,防止客户端可以直连到真正的数据库。
Maria存储引擎
Maria引擎的开发者是MySQL的创始人之一的Michael Widenius,它设计的目标是用来替换原有的MyISAM引擎,可以看成是MyISAM的后续版,Maria引擎的特点是支持缓存数据和索引文件、支持事务、行锁等功能。我们现在谈及的MySQL其实有两个版本,一个是传统先后被SUN、Oracle收购的版本,一个是原MySQL创始人Michael Widenius所开发的Maria版本,在一些linux发行版中当安装MySQL服务时,虽然名字还是叫MySQL但是安装的是Maria版本,具体可以自行去查阅关于MySQL和Maria之间的关系。
三、 MyISAM和InnoDB 比较(简单版)
存储引擎 |
MyISAM |
InnoDB |
构成上的区别: |
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI (MYIndex)。 |
基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB |
事务处理上方面: |
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 |
InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能 |
SELECT,UPDATE, INSERT,Delete操作 |
如果执行大量的SELECT,MyISAM是更好的选择 |
a. 如果你的数据执行大量的INSERT 或 UPDATE,出于性能方面的考虑,应该使用InnoDB表
b. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
C. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用 |
对AUTO_INCREMENT 的操作(用于主键自动增长) |
a. 每表一个AUTO_INCREMEN列的内部处理。
b. MyISAM 为 INSERT 和 UPDATE 操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。
c. AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置
d. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
e. 更好和更快的auto_increment处理 |
a.如果你为一个表指定b.AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。
C.自动增长计数器仅被存储在主内存中,而不是存在磁盘上
d.关于该计算器的算法实现,请参考
e.AUTO_INCREMENT 列在 InnoDB 里如何工作 |
表的具体行数 |
select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的 |
InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行 |
锁 |
表锁 |
提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like “?a%” |