第1章 MySQL体系结构和存储引擎 阅读总结

第1章 MySQL体系结构和存储引擎 阅读总结_第1张图片

        MySQL被设计为一个可移植的数据库, 几乎在当前所有系统上都能运行, 如 Linux, Solaris、FreeBSD、Mac和Windows。 尽管各平台在底层(如线程) 实现方面都各有不同, 但是MySQL基本上能保证在各平台上的物理体系结构的一致性。 因此, 用户应该能很好地理解MySQL数据库在所有这些平台上是如何运作的。

1.1 定义数据库和实例

        在数据库领域中有两个词很容易混淆, 这就是 “数据库"(database) 和 “ 实例 ” (instance)。 作为常见的数据库术语, 这两个词的定义如下。

        数据库:物理操作系统文件或其他形式文件类型的集合。 在MySQL数据库中, 数据库文件可以是frm、MYD、MYI、ibd结尾的文件。 当使用NDB引擎时, 数据库的文件可能不是操作系统上的文件, 而是存放于内存之中的文件, 但是定义仍然不变。

        实例: MySQL数据库由后台线程以及一个共享内存区组成。 共享内存可以被运行的后台线程所共享。 需要牢记的是, 数据库实例才是真正用于操作数据库文件的。

        在MySQL数据库中, 实例与数据库的关通常系是一一对应的, 即一个实例对应一个数据库, 一个数据库对应一 个实例。 但是, 在集群情况下可能存在一个数据库被多个数据实例使用的情况。

        MySQL被设计为一个单进程多线程架构的数据库, 这点与SQLServer比较类似,但与Oracle多进程的架构有所不同(Oracle的Windows版本也是单进程多线程架构的)。 这也就是说, MySQL数据库实例在系统上的表现就是一个进程。

1.2 MySQL 体系结构

        从概念上来说,数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程 序只有通过数据库实例才能和数据库打交道。


第1章 MySQL体系结构和存储引擎 阅读总结_第2张图片


第1章 MySQL体系结构和存储引擎 阅读总结_第3张图片

        从图 1-1 还可以发现,MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如 SQL分析器和优化器等,而存储引擎是底层物理结构的实现, 每个存储引擎开发者可以按照自己的意愿来进行开发。

        需要特别注意的是,存储引擎是基于表的,而不是数据库。此外,要牢记图 1-1 的 MySQL体系结构,它对于以后深入理解MySQL数据库会有极大的帮助。

1.3 MySQL存储引擎

        通过1.2节大致了解了MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性存储引擎的好处是,每个存储引擎都有各自的特点, 能够根据具体的应用建立不同存储引擎表

1.3.1 lnnoDB 存储引擎

        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 buff er)、二次写 (double write)、自适应哈希索引 (adaptive hash index)、预读 (read ahead) 等高性能和高可用的功能。

        对于表中数据的存储,InnoDB 存储引擎采用了聚集 (clustered) 的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地在表定义时指定主键,InnoDB 存 储引擎会为每一行生成一个 6 字节的 ROWID, 并以此作为主键。

1.3.2 MylSAM存储引擎

        MyISAM存储引擎 不支持事务、表锁设计, 支持全文索引,主要面向一些OLAP数据库应用。在MySQL 5.5.8版本之前MylSAM存储引擎是默认的存储引擎(除Windows版本外)。数据库系统与文件系统很大的 个不同之处在于对事务的支持,然而MyISAM存储引擎是不支持事务的。究其根本,这也不是很难理解。试想用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有 ETL这些操作, 只是简单的报表查询是否还需要事务的支持呢?此外,MylSAM存储引擎的另一个与众不同的地方是它 的缓冲池只 缓存(cache)索引文件,而不缓冲数据文件,这点和大多数的数据库都非常不同 。

        MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以通过使用myisampack工具来进一步压缩数据文件,因为myisampack 工具使用赫夫曼(Huffma n)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,当然用户也可以通过myisampack来解压数据文件。

1.3.3 NOB存储引擎

        NOB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RACshare everything架构不同的是,其结构是 share nothing的集群架构,因此能提供更高的可用性。NOB的特点是数据全部放在内存中(从MySQL 5.1版本开始,可以将非索引数据放在 磁盘上),因此主键查找(primary key lookups)的速度极快,并且通过添加NOB数据存储节点(Data Node)可以线性地提高数据库性能,是高可用、高性能的集群系统。

        关于 NDB存储引擎,有一个问题值得注意,那就是 NDB存储引擎的连接操作(JOIN)是在 MySQL数据库层完成的,而不是在存储引擎层完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。如果解决了这个问题,NDB存储引 擎的市场应该是非常巨大的。

1.3.4 Memory存储引擎

        Memory存储引擎( 之前称HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合用于存储临时数据的临时表, 以及数据仓库中的纬度表。Memory存储引擎默认使用哈希索引,而不是我们熟悉的 B+ 树索引。

        虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制。比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存。

        此外有一点容易被忽视,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result)。如果中间结果集大于 Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换到MylSAM存储引擎表而存放到磁盘中。之前提到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.5 连接MySQL

        本节将介绍连接MySQL数据库的常用方式。需要理解的是,连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。从程序设计的角度来说,本质上是进程通信。 如果对进程通信比较了解,可以知道常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。MySQL数据库提供的连接方式从本质上看都是上述提及的进程通信方式。

1.5.1 TCP/IP

        TCP/IP套接字方式是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求,,一般情况下客户端(client)在一台服务器上,而MySQL 实例(server)在另一台服务器上,这两台机器通过一个TCP/IP网络连接。

1.5.2 命名管道和共享内存

        在 Windows2000、 WindowsXP、 Windows 2003 和 Windows Vista 以及在此之上的平台上, 如果两个需要进程通信的进程在同一台服务器上, 那么可以使用命名管道, Microsoft SQL Server 数据库默认安装后的本地连接也是使用命名管道。在 MySQL 数据库中须在配置文件中启用 --enable-named-pipe 选项。 在 MySQL 4.1 之后的版本中, MySQL 还提供了 共享内存的连接方式, 这是通过在配置文件中添加 --shared-memory 实现的。 如果想使用 共享内存的方式, 在连接时, MySQL 客户端还必须使用 --protocol=memory 选项。

1.5.3 UNIX 域套接字

        在Linux和UNIX环境下, 还可以使用UNIX域套接字。UNIX域套接字其实不是一个网络协议, 所以只能在 MySQL 客户端和数据库实例在一台服务器上的情况下使用。 用户可以在配置文件中指定套接字文件的路径。

你可能感兴趣的:(第1章 MySQL体系结构和存储引擎 阅读总结)