---
title: 概述
taxonomy:
    category: docs
---

InnoDB 是磁盘存储引擎技术的巅峰之作，代表了磁盘数据库最先进的技术水平，给人类创造了巨大的价值。它提供了许多高级功能，如事务支持、行级锁定、崩溃恢复等。

### InnoDB 的发展历程和设计目标

2004 年，扎克伯格选择了 MySQL 来创建 Facebook，不承想，Facebook 迅速火遍了全世界。随后的十年里，Google、亚马逊、阿里巴巴等互联网巨头纷纷选择 MySQL 作为自己的核心数据库，这带来了 MySQL 的高速发展：这些互联网巨头投入大量技术资源将 MySQL 打造成了一款非常优秀的开源数据库软件，而 InnoDB 则是其中最受重视的部分。

这些公司的数据库需求基本相似：表字段较少，但行数众多；对单个查询的时间要求极高；很少存储长字符串和二进制文件。这种需求恰好不是传统数据库（如 Oracle）的强项。而且，互联网公司的发展一日千里，无论是授权费还是实施速度，买 Oracle 都不如自己魔改 MySQL 来的方便。之后的十几年，MySQL 特别是 InnoDB 的发展真的可以说是虎虎生风、一日千里，如果你站在 2014 往回看 2004，也确实称得上恍如隔世。

但 InnoDB 也不是银弹，它的性能也是靠“取舍”得来的。

### InnoDB 拿什么找信息之神换了什么？

和之前的 MyISAM 相比，InnoDB 最大的变化就是将磁盘上数据的基本存储结构从索引+数据这样的分体式，变成了所有数据都挂在索引上的整体式：从“B+ 树索引”加“磁盘连续存储数据”(中间用指针链接)变成了“B+ 树存储全部索引和数据”。

这个操作给 MySQL 带来了翻天覆地的变化。那么，InnoDB 到底做了哪些取舍呢？

#### 代价

1. 插入和更新性能显著下降（100~1000 倍，但绝对耗时仍在毫秒级别）
2. 一次性读取连续多行的复杂度大幅提升（大约提升了`行数/10`那么多倍）
3. 事务隔离导致大表 count(*) 的返回时间令人崩溃（多少倍已经无法衡量，一千倍到一千亿倍吧）
4. 放弃了数据完全压缩能力（磁盘占用 2-5 倍）
5. 写入放大显著增加，对磁盘特别是固态磁盘 (SSD) 形成了额外的压力

#### 收益

1. 支持事务：事务是极其核心的功能进步，使 MySQL 摆脱了玩具定位，真正实现了 `ACID`，成为了一个合格的 OLTP 数据库
2. 大表的单行读取性能暴增：这是数据挂在 B+ 树索引上带来的优势，还可以依靠内存缓存进行加速和局部性优化
3. DML (表结构变更) 操作的安全性大幅提升，数据损坏的概率大幅降低
4. 联表查询性能大幅提升，让 MySQL 在 OLAP 方向也有很大进步
5. 支持全文检索：类似于 ES 的倒排索引
6. 其他小收益：支持了行锁、内存缓存、外键约束等

这些代价和收益，基本都是两个东西带来的：B+ 树和 Buffer Pool。下面我们分别认识一下这两个技术。
