《MySQL技术内幕:InnoDB存储引擎第2版》——1.4 各存储引擎之间的比较

1.4 各存储引擎之间的比较

通过1.3节的介绍,我们了解了存储引擎是MySQL体系结构的核心。本节我们将通过简单比较几个存储引擎来让读者更直观地理解存储引擎的概念。图1-2取自于MySQL的官方手册,展现了一些常用MySQL存储引擎之间的不同之处,包括存储容量的限制、事务支持、锁的粒度、MVCC支持、支持的索引、备份和复制等。
可以看到,每种存储引擎的实现都不相同。有些竟然不支持事务,相信在任何一本关于数据库原理的书中,可能都会提到数据库与传统文件系统的最大区别在于数据库是支持事务的。而MySQL数据库的设计者在开发时却认为可能不是所有的应用都需要事务,所以存在不支持事务的存储引擎。更有不明其理的人把MySQL称做文件系统数据库,其实不然,只是MySQL数据库的设计思想和存储引擎的关系可能让人产生了理解上的偏差。
可以通过SHOW ENGINES语句查看当前使用的MySQL数据库所支持的存储引擎,也可以通过查找information_schema架构下的ENGINES表,如下所示:

mysql>SHOW ENGINES\G;
*************************** 1. row ***************************
      Engine: InnoDB
     Support: YES
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: MyISAM
     Support: DEFAULT
     Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
          XA: NO
  Savepoints: NO
8 rows in set (0.00 sec)

下面将通过MySQL提供的示例数据库来简单显示各存储引擎之间的不同。这里将分别运行以下语句,然后统计每次使用各存储引擎后表的大小。

mysql>CREATE TABLE mytest Engine=MyISAM
    ->AS SELECT * FROM salaries;
Query OK, 2844047 rows affected (4.37 sec)
Records: 2844047  Duplicates: 0  Warnings: 0

mysql>ALTER TABLE mytest Engine=InnoDB;
Query OK, 2844047 rows affected (15.86 sec)
Records: 2844047  Duplicates: 0  Warnings: 0

mysql>ALTER TABLE mytest Engine=ARCHIVE;
Query OK, 2844047 rows affected (16.03 sec)
Records: 2844047  Duplicates: 0  Warnings: 0

通过每次的统计,可以发现当最初表使用MyISAM存储引擎时,表的大小为40.7MB,使用InnoDB存储引擎时表增大到了113.6MB,而使用Archive存储引擎时表的大小却只有20.2MB。该例子只从表的大小方面简单地揭示了各存储引擎的不同。
注意 MySQL提供了一个非常好的用来演示MySQL各项功能的示例数据库,如SQL Server提供的AdventureWorks示例数据库和Oracle提供的示例数据库。据我所知,知道MySQL示例数据库的人很少,可能是因为这个示例数据库没有在安装的时候提示用户是否安装(如Oracle和SQL Server)以及这个示例数据库的下载竟然和文档放在一起。用户可以通过以下地址找到并下载示例数据库:http://dev.mysql.com/doc/

时间: 2024-09-21 16:05:06

《MySQL技术内幕:InnoDB存储引擎第2版》——1.4 各存储引擎之间的比较的相关文章

《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版》——1.3 MySQL存储引擎

1.3 MySQL存储引擎 通过1.2节大致了解了MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性.存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表.对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是有好处的.对于DBA来说,他们应该深刻地认识到MySQL数据库的核心在于存储引擎. 由于MySQL数据库的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎.若用

《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文件

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

前言 为什么要写这本书 过去这些年我一直在和各种不同的数据库打交道,见证了MySQL从一个小型的关系型数据库发展为各大企业的核心数据库系统的过程,并且参与了一些大大小小的项目的开发工作,成功地帮助开发人员构建了可靠的.健壮的应用程序.在这个过程中积累了一些经验,正是这些不断累积的经验赋予了我灵感,于是有了这本书.这本书实际上反映了这些年来我做了哪些事情,其中汇集了很多同行每天可能都会遇到的一些问题,并给出了解决方案. MySQL数据库独有的插件式存储引擎架构使其和其他任何数据库都不同.不同的存储

《MySQL技术内幕:InnoDB存储引擎第2版》——3.2 日志文件

3.2 日志文件 日志文件记录了影响MySQL数据库的各种类型活动.MySQL数据库中常见的日志文件有: ?错误日志(error log) ?二进制日志(binlog) ?慢查询日志(slow query log) ?查询日志(log) 这些日志文件可以帮助DBA对MySQL数据库的运行状态进行诊断,从而更好地进行数据库层面的优化.3.2.1 错误日志 错误日志文件对MySQL的启动.运行.关闭过程进行了记录.MySQL DBA在遇到问题时应该首先查看该文件以便定位问题.该文件不仅记录了所有的错

《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