MySQL技术内幕:InnoDB存储引擎


在这之前,我买过有关Oracle的一本书《Oracle 9i & 10g编程艺术》。但是对于我而言,理解这本书有点困难。所以看了这本书的一部分后,就没有再看。

基于现实原因,现在用MySQL的越来越多,一直以来想好好研究下。图书馆的书又不怎么给力,便买了这本书《MySQL技术内幕:InnoDB存储引擎》。现在有种习惯,买书之前必上豆瓣上看下评价,觉得还不错的话,就会果断下手。

前面讲了一大堆,现在来说说这本书。本书作者是姜承尧,从书中可知他是读过MySQL源码的人。引用本书中的一句话“本书完整地讲解了InnoDB存储引擎中最重要的一些内容,即InnoDB的体系结构和工作原理,并结合InnoDB的源代码讲解了它的实现机制。”

在第一章中,本书讲解了MySQL体系结构和各种存储引擎,并作出了比较。其中MySQL提供的连接方式有TCP/IP套接字方式、命名管道和共享内存、Unix域套接字。

第二章中,对InnoDB存储引擎进行了分析,包括InnoDB体系结构、master thread、关键特性等。本书中对InnoDB Plugin(新版本的InnoDB存储引擎)提及的比较多。InnoDB的关键特性包括插入缓冲、两次写、自适应哈希索引,这些特性使得InnoDB存储引擎变得更具“魅力”。

第三章,对文件作了分析,有参数文件、日志文件、套接字文件、pid文件、表结构定义文件、InnoDB存储引擎文件。二进制日志的作用非常关键,可以用来进行point in time的恢复以及复制(replication)环境的搭建。因此,作者建议在任何时候都启用二进制日志的记录。从MySQL 5.1开始,二进制日志支持 STATEMENT、ROW、MIX三种格式,用来更好地同步数据库。在对InnoDB存储引擎文件的讲解中,主要包括表空间文件和重做日志文件。表空间文件是用来管理InnoDB存储引擎的存储,分为共享表空间和独立表空间。重做日志非常重要,用来记录InnoDB存储引擎的事务日志,也因为重做日志的存在,才使得InnoDB存储引擎可以提供可靠的事务。

第四章,对InnoDB存储引擎表作了讲解。我大概只看了本章的五分之一吧,继续下一章。

第五章,索引与算法。InnoDB存储引擎支持两种常见的索引,一种是B+树索引,另一种是哈希索引。InnoDB存储引擎支持的哈希索引是自适应的。本章对B+树插入、删除、索引等操作进行了详细分析。再者还包括二分查找树、平衡树、直接寻址表和哈希表。

第六章,锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。MyISAM存储引擎的锁是表锁,并发读没有问题,但是并发插入时的性能就要差一些了。对于Microsoft SQL Server来说,在Microsoft SQL Server 2005版本之前都是页锁的,相对于表锁来说,并发性能有所提高。到2005版本,Microsoft SQL Server开始支持乐观并发和悲观并发。在乐观并发下开始支持行级锁。其中有一点非常重要,在Microsoft SQL Server下,锁是一种稀有的资源,锁越多,开销就越大,因此它会有锁升级。InnoDB存储引擎中的锁和Oracle类似。有两种标准的行级锁,共享锁(S Lock)和排他锁(X Lock)。书中对锁的算法也进行了讲解,分别是Record Lock、Gap Lock、Next-Key Lock。锁会带来三种问题,丢失更新、脏读、不可重复读。解决丢失更新的办法是加个排它锁。由于目前绝大部分的数据库都将事务的隔离级别至少设置成READ COMMITTED。所以不可能满足脏读发生的条件:READ UNCOMMITTED。InnoDB存储引擎默认的事务隔离级别为READ REPEATABLE,这个在后面的章节中会再次提到。InnoDB存储引擎是通过使用Next-Key Lock算法来避免不可重复读的问题。

第七章,事务用来保证数据库的完整性。锁实现了事务的隔离性。原子性、一致性、持久性通过数据库的redo和undo来完成。在使用分布式事务时,事务隔离级别必须设置成SERIALIABLE。分布式事务是由一个或者多个资源管理器(Resource Managers)、一个事务管理器(Transaction Manager)以及一个应用程序(Application Program)组成。本书讲到了开发人员非常不好的事务习惯,他们喜欢在循环中进行事务的提交。由于每一次提交都要写一次重做日志,因此浪费了很多时间。再者,InnoDB存储引擎有自动提交事务的功能。所以,执行循环事务时,会使用start transaction 和 commit。有些语言不是自动提交事务的,比如MySQL Python API 则是自动执行SET AUTOCOMMIT=0(这个我亲自试过,不commit的话,MySQL中是没有的)。所以作者提倡,在编写应用程序开发时,最好把事务的控制权限交给开发人员,即在程序端进行事务的开始和结束。

第八章,备份与恢复,主要是热备、冷备、温备。以及mysqldump和xtrabackup等工具的使用。最后,讲解了复制,通过快照和复制技术的结合,可以保证我们得到一个实时的在线MySQL备份解决方案。

第九章,本章主要从下面几个方面讲解了InnoDB的性能问题:选择合适的CPU、内存的重要性、硬盘对数据库性能的影响、合理地设置RAID、操作系统的选择也很重要、不同文件系统对数据库的影响、选择合适的基准测试工具。如果想深入了解性能调优,我建议看这本书《MySQL性能调优与架构设计》。

第十章,InnoDB存储引擎源代码的编译与调试。


下篇: shutdown hook in java programming language