InnoDB 关键特性-自适应哈希索引和异步IO

225 阅读3分钟

「这是我参与 2022 首次更文挑战的第 25 天,活动详情查看:2022 首次更文挑战

劳而不伐,有功而不德,厚之至也。

前言

前文讲述了 mysql 数据库 InnoDB 引擎关键特性-两次写,本文继续介绍 InnoDB 的特性自适应哈希索引和异步IO,自适应哈希索引能保证在特定的场景下,提高数据的查询性能,而异步IO则能够在写数据的场景下提高数据的插入性能,也能在读场景下提高数据的查询性能。

自适应哈希索引

hash 是一种非常快的查找方法,其时间复杂度为 O(1)。在 B + Tree 中查找数据的次数,取决于树的高度,一般情况下树的高度为 3~4 层,因此需要 3~4 次的查询。

InnoDB 存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)AHI 是通过缓冲池的 B+Tree 来构造的,因此建立起来速度很快,而且不需要对整张表构建哈希索引。InnoDB 存储引擎会自动根据访问的频率和模式来自动的为某些热点页建立哈希索引。

AHI 有一个要求,即对这个页的连续访问模式必须是一样的,访问模式一样是指的查询条件一样,对于一个联合索引,如果满足了以下两个条件:

  • 1 以该模式访问了 100 次。
  • 2 数据页通过该模式被访问了 N 次, 其中 N = 命中记录/16

启用 AHI 之后,读取和写入速度可以提高 2 倍,辅助索引的连接操作性能可以提高 5 倍。启用自适应哈希索引,可以使用 innodb_adaptive_hash_index 来禁用或者启用,默认为开启状态。

# 查询自适应哈希索引相关配置
show variables like "innodb_adaptive%"

异步 IO

为了提高磁盘的操作性能,当前的数据库系统都采用 AIO 的方式来处理磁盘操作。异步 IO的操作在数据存储时是很常见的操作,避免了数据同步操作带来的耗时操作,节省了响应时间。再者,异步IO 也是将数据存放在缓存区,交予操作系统根据自身的定时任务异步处理数据的存储,更加高效一点儿。

异步IO 对应的是同步IO,即每一次的 IO 操作都需要等待操作结束后才能继续后续操作。一条查询的 sql 语句可能需要扫描多个索引页,也就是需要进行多次的 IO 操作,可以一次发送多个 IO 操作等待结果后进行合并,这就是 AIO。另外一个优势是可以将 IO 进行 Merge 操作,也就是将多个 IO 合并为 1 个 IO,这样就可以提高 IOPS 的性能。

# 可以通过配置来开启和关闭 aio
show variables like "innodb_use_native_aio%"

总结

本文讲述了 InnoDB 的关键特性自适应哈希索引和异步IO,这两个特性的工作原理以及如何配置这些特性,下一节会继续介绍最后一个特性刷新邻接页。