DDIA 笔记 | 存储引擎
存储引擎 什么是存储引擎呢?如果说引擎是汽车的核心部件,那存储引擎同样也是数据库的核心部件,它规定了数据存储时的结构、对数据进行增删改查操作的接口,以及索引、锁和其他功能。 存储引擎也有许多不同的分类维度。从对数据的处理方式上来看,主要有两种,OLTP 和 OLAP;而从数据存储的结构上来看,也会分为行存和列存;为了加速数据的查询,又设计出了各种不同的索引结构。 这篇文章,就从这几个角度来分别介绍一下概念、原理和优缺点,在掌握了这些有关存储引擎内部的知识,你就能更好地为自己的应用挑选合适的存储引擎,做出更有效的优化。 本文的大部分内容,来自于《Designing Data-Intensive Application》,好书值得细品。 最简单的存储引擎 如果让你用几行代码来实现一个存储引擎(或者数据库),你会怎么做? 我们可以用 linux 命令来实现数据的读取和写入: #!/bin/bash db_set () { echo "$1,$2" >> database } db_get () { grep "^$1," database | sed -e "s/^$1,//" | tail -n 1 } 写入时,使用 echo 命令将数据以 key - value (键值对)的形式存入文件;查询时,使用 grep 和 sed 命令来获取 key 对应的 value,并用 tail 命令获取最新的一条数据。 这样,我们用两个函数就实现了一个最简单的数据库,可以存入 key - value 结构的数据,而且和很多真正的数据库一样,内部使用 log (日志)数据文件,并且是 append-only(仅追加)的数据文件,而正因为每次写入都是在文本尾部追加,这个数据库有非常不错的写入性能。 但是读取数据的时候,性能就不尽人意了。如果存储的数据量很大,每次使用 db_get() 查询时,必须从头到尾扫描整个数据库文件,时间开销是 O(n) 的,意味着如果数据量翻了 n 倍,查询耗时也要翻 n 倍,这是不能接受的。...