logo

概述

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。下面我们分别认识一下这两个技术。

阅读数:998      字数:974 最后更新:2023-10-26 10:23:07