「这是我参与 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,这两个特性的工作原理以及如何配置这些特性,下一节会继续介绍最后一个特性刷新邻接页。