《MySQL技术内幕:InnoDB存储引擎第2版》——1.3 MySQL存储引擎

1.3 MySQL存储引擎

通过1.2节大致了解了MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性。存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是有好处的。对于DBA来说,他们应该深刻地认识到MySQL数据库的核心在于存储引擎。
由于MySQL数据库的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎。若用户对某一种存储引擎的性能或功能不满意,可以通过修改源码来得到想要的特性,这就是开源带给我们的方便与力量。比如,eBay的工程师Igor Chernyshev对MySQL Memory存储引擎的改进(http://code.google.com/p/mysql-heap-dynamic-rows/)并应用于eBay的Personalization Platform,类似的修改还有Google和Facebook等公司。笔者曾尝试过对InnoDB存储引擎的缓冲池进行扩展,为其添加了基于SSD的辅助缓冲池,通过利用SSD的高随机读取性能来进一步提高数据库本身的性能。当然,MySQL数据库自身提供的存储引擎已经足够满足绝大多数应用的需求。如果用户有兴趣,完全可以开发自己的存储引擎,满足自己特定的需求。MySQL官方手册的第16章给出了编写自定义存储引擎的过程,不过这已超出了本书所涵盖的范围。
由于MySQL数据库开源特性,存储引擎可以分为MySQL官方存储引擎和第三方存储引擎。有些第三方存储引擎很强大,如大名鼎鼎的InnoDB存储引擎(最早是第三方存储引擎,后被Oracle收购),其应用就极其广泛,甚至是MySQL数据库OLTP(Online Transaction Processing在线事务处理)应用中使用最广泛的存储引擎。还是那句话,用户应该根据具体的应用选择适合的存储引擎,以下是对一些存储引擎的简单介绍,以便于读者选择存储引擎时参考。
1.3.1 InnoDB存储引擎
InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。
InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB存储引擎自身进行管理。从MySQL 4.1(包括4.1)版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。此外,InnoDB存储引擎支持用裸设备(row disk)用来建立其表空间。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。
InnoDB存储引擎是MySQL数据库最为常用的一种引擎,而Facebook、Google、Yahoo!等公司的成功应用已经证明了InnoDB存储引擎具备的高可用性、高性能以及高可扩展性。
1.3.2 MyISAM存储引擎
MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL 5.5.8版本之前MyISAM存储引擎是默认的存储引擎(除Windows版本外)。数据库系统与文件系统很大的一个不同之处在于对事务的支持,然而MyISAM存储引擎是不支持事务的。究其根本,这也不是很难理解。试想用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有ETL这些操作,只是简单的报表查询是否还需要事务的支持呢?此外,MyISAM存储引擎的另一个与众不同的地方是它的缓冲池只缓存(cache)索引文件,而不缓冲数据文件,这点和大多数的数据库都非常不同。
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以通过使用myisampack工具来进一步压缩数据文件,因为myisampack工具使用赫夫曼(Huffman)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,当然用户也可以通过myisampack来解压数据文件。
在MySQL 5.0版本之前,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要制定MAX_ROWS和AVG_ROW_LENGTH属性。从MySQL 5.0版本开始,MyISAM默认支持256TB的单表数据,这足够满足一般应用需求。
注意 对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据的大部分数据库大不相同。此外,在MySQL 5.1.23版本之前,无论是在32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4GB。在之后的版本中,64位系统可以支持大于4GB的索引缓冲区。
1.3.3 NDB存储引擎
2003年,MySQL AB公司从Sony Ericsson公司收购了NDB集群引擎(见图1-1)。NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RAC share everything架构不同的是,其结构是share nothing的集群架构,因此能提供更高的可用性。NDB的特点是数据全部放在内存中(从MySQL 5.1版本开始,可以将非索引数据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性地提高数据库性能,是高可用、高性能的集群系统。
关于NDB存储引擎,有一个问题值得注意,那就是NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。如果解决了这个问题,NDB存储引擎的市场应该是非常巨大的。
注意 MySQL NDB Cluster存储引擎有社区版本和企业版本两种,并且NDB Cluster已作为Carrier Grade Edition单独下载版本而存在,可以通过http://dev.mysql.com/downloads/cluster/index.html获得最新版本的NDB Cluster存储引擎。
1.3.4 Memory存储引擎
Memory存储引擎(之前称HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合用于存储临时数据的临时表,以及数据仓库中的纬度表。Memory存储引擎默认使用哈希索引,而不是我们熟悉的B+树索引。
虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制。比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存(这个问题之前已经提到,eBay的工程师Igor Chernyshev已经给出了patch解决方案)。
此外有一点容易被忽视,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result)。如果中间结果集大于Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。之前提到MyISAM不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
1.3.5 Archive存储引擎
Archive存储引擎只支持INSERT和SELECT操作,从MySQL 5.1开始支持索引。Archive存储引擎使用zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1∶10。正如其名字所示,Archive存储引擎非常适合存储归档数据,如日志信息。Archive存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。
1.3.6 Federated存储引擎
Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表。这非常类似于SQL Server的链接服务器和Oracle的透明网关,不同的是,当前Federated存储引擎只支持MySQL数据库表,不支持异构数据库表。
1.3.7 Maria存储引擎
Maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎。Maria存储引擎的开发者是MySQL的创始人之一的Michael Widenius。因此,它可以看做是MyISAM的后续版本。Maria存储引擎的特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。
1.3.8 其他存储引擎
除了上面提到的7种存储引擎外,MySQL数据库还有很多其他的存储引擎,包括Merge、CSV、Sphinx和Infobright,它们都有各自使用的场合,这里不再一一介绍。在了解MySQL数据库拥有这么多存储引擎后,现在我可以回答1.2节中提到的问题了。
?为什么MySQL数据库不支持全文索引?不!MySQL支持,MyISAM、InnoDB(1.2版本)和Sphinx存储引擎都支持全文索引。
?MySQL数据库速度快是因为不支持事务?错!虽然MySQL的MyISAM存储引擎不支持事务,但是InnoDB支持。“快”是相对于不同应用来说的,对于ETL这种操作,MyISAM会有其优势,但在OLTP环境中,InnoDB存储引擎的效率更好。
?当表的数据量大于1000万时MySQL的性能会急剧下降吗?不!MySQL是数据库,不是文件,随着数据行数的增加,性能当然会有所下降,但是这些下降不是线性的,如果用户选择了正确的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。如官方手册上提及的,Mytrix和Inc.在InnoDB上存储超过1?TB的数据,还有一些其他网站使用InnoDB存储引擎,处理插入/更新的操作平均800次/秒。

时间: 2024-08-03 02:32:14

《MySQL技术内幕:InnoDB存储引擎第2版》——1.3 MySQL存储引擎的相关文章

《MySQL技术内幕:InnoDB存储引擎第2版》——2.3 InnoDB体系架构

2.3 InnoDB体系架构 通过第1章读者已经了解了MySQL数据库的体系结构,现在可能想更深入地了解InnoDB存储引擎的架构.图2-1简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: ?维护所有进程/线程需要访问的多个内部数据结构. ?缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存. ?重做日志(redo log)缓冲. -- 后台线程的主要作用是负责刷新内存池中的数据

《MySQL技术内幕:InnoDB存储引擎第2版》——2.5 Master Thread工作方式

2.5 Master Thread工作方式 在2.3节中我们知道了,InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成的,这一节将具体解释该线程的具体实现及该线程可能存在的问题.2.5.1 InnoDB 1.0.x版本之前的Master ThreadMaster Thread具有最高的线程优先级别.其内部由多个循环(loop)组成:主循环(loop).后台循环(backgroup loop).刷新循环(flush loop).暂停循环(suspend loop

《MySQL技术内幕:InnoDB存储引擎第2版》——2.4 Checkpoint技术

2.4 Checkpoint技术 前面已经讲到了,缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟.因此页的操作首先都是在缓冲池中完成的.如果一条DML语句,如Update或Delete改变了页中的记录,那么此时页是脏的,即缓冲池中的页的版本要比磁盘的新.数据库需要将新版本的页从缓冲池刷新到磁盘.倘若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常大的.若热点数据集中在某几个页中,那么数据库的性能将变得非常差.同时,如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那么数据就不

《MySQL技术内幕:InnoDB存储引擎第2版》——2.7 启动、关闭与恢复

2.7 启动.关闭与恢复 InnoDB是MySQL数据库的存储引擎之一,因此InnoDB存储引擎的启动和关闭,更准确的是指在MySQL实例的启动过程中对InnoDB存储引擎的处理过程. 在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为.该参数可取值为0.1.2,默认值为1. ?0表示在MySQL数据库关闭时,InnoDB需要完成所有的full purge和merge insert buffer,并且将所有的脏页刷新回磁盘.这需要一些时间,有时甚至需要几

《MySQL技术内幕:InnoDB存储引擎第2版》——2.2 InnoDB存储引擎的版本

2.2 InnoDB存储引擎的版本 InnoDB存储引擎被包含于所有MySQL数据库的二进制发行版本中.早期其版本随着MySQL数据库的更新而更新.从MySQL 5.1版本时,MySQL数据库允许存储引擎开发商以动态方式加载引擎,这样存储引擎的更新可以不受MySQL数据库版本的限制.所以在MySQL 5.1中,可以支持两个版本的InnoDB,一个是静态编译的InnoDB版本,可将其视为老版本的InnoDB:另一个是动态加载的InnoDB版本,官方称为InnoDB Plugin,可将其视为Inno

《MySQL技术内幕:InnoDB存储引擎第2版》——3.7 小结

3.7 小结 本章介绍了与MySQL数据库相关的一些文件,并了解了文件可以分为MySQL数据库文件以及与各存储引擎相关的文件.与MySQL数据库有关的文件中,错误文件和二进制日志文件非常重要.当MySQL数据库发生任何错误时,DBA首先就应该去查看错误文件,从文件提示的内容中找出问题的所在.当然,错误文件不仅记录了错误的内容,也记录了警告的信息,通过一些警告也有助于DBA对于数据库和存储引擎进行优化. 二进制日志的作用非常关键,可以用来进行point in time的恢复以及复制(replica

《MySQL技术内幕:InnoDB存储引擎第2版》——3.1 参数文件

3.1 参数文件 在第1章中已经介绍过了,当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取,用户只需通过命令mysql--help | grep my.cnf来寻找即可. MySQL数据库参数文件的作用和Oracle数据库的参数文件极其类似,不同的是,Oracle实例在启动时若找不到参数文件,是不能进行装载(mount)操作的.M

《MySQL技术内幕:InnoDB存储引擎第2版》——2.6 InnoDB关键特性

2.6 InnoDB关键特性 InnoDB存储引擎的关键特性包括: ?插入缓冲(Insert Buffer) ?两次写(Double Write) ?自适应哈希索引(Adaptive Hash Index) ?异步IO(Async IO) ?刷新邻接页(Flush Neighbor Page) 上述这些特性为InnoDB存储引擎带来更好的性能以及更高的可靠性.2.6.1 插入缓冲 1.?Insert Buffer Insert Buffer可能是InnoDB存储引擎关键特性中最令人激动与兴奋的一

《MySQL技术内幕:InnoDB存储引擎第2版》——第3章 文件

第3章 文件 本章将分析构成MySQL数据库和InnoDB存储引擎表的各种类型文件.这些文件有以下这些. ?参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型. ?日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件,如错误日志文件.二进制日志文件.慢查询日志文件.查询日志文件等. ?socket文件:当用UNIX域套接字方式进行连接时需要的文件. ?pid文件:MySQL实例的进程ID文件