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. DDL ( 表结构变更 ) 操作的安全性大幅提升,数据损坏的概率大幅降低
  4. 联表查询性能大幅提升,让 MySQL 在 OLAP 方向也有很大进步
  5. 支持全文检索:类似于 ES 的倒排索引
  6. 其他小收益:支持了行锁、内存缓存、外键约束等

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

阅读数:2001      字数:984 最后更新:2024-08-20 14:13:33