使用 LSM 树提升写入性能
在了解 LSM 树存储引擎之前,我们先来说说磁盘的随机IO、顺序IO。通常数据库的数据最终都是持久化到磁盘上,而对磁盘的访问方式有两种,即:
- 随机IO
随机 IO 就需要花费时间做昂贵的磁盘寻道,一般来说,它的读写效率要比顺序 IO 小好几个数量级,所以我们想要提升写入的性能就要尽量减少随机 IO - 顺序IO
以 MySQL 的 InnoDB 存储引擎来说,更新 binlog、redolog、undolog 都是在做顺序 IO,而更新 datafile 和索引文件则是在做随机 IO,而为了减少随机 IO 的发生,关系数据库已经做了很多的优化,比如说写入时先写入内存,然后批量刷新到磁盘上,但是随机 IO 还是会发生。
索引在 InnoDB 引擎
中是以 B+ 树(上一节课提到了 B+ 树,你可以回顾一下)方式来组织的,而 MySQL 主键是聚簇索引(一种索引类型,数据与索引数据放在一起),既然数据和索引数据放在一起,那么在数据插入或者更新的时候,我们需要找到要插入的位置,再把数据写到特定的位置上,这就产生了随机的 IO。而且一旦发生了页分裂,就不可避免会做数据的移动,也会极大地损耗写入性能。
目前很多 NoSQL
数据库都在使用基于 LSM
树的存储引擎,例如 RocksDB、LevelDB、HBase 以及 Prometheus 等,这也是为什么这些数据库的写入性能很高的原因。