数据库核心:数据结构
最简单的由两个Bash函数组成的数据库。实际测试并未生效,待查!
#!/bin/bash
db_set() {
echo "$1,$2" >> database
}
db_get() {
grep "^$1," database | sed -e "s/^$1,//" | tail -n 1
}
当调用 db_set 时,每个KV对用逗号间隔,作为一行保存在纯文本文件中,类似CSV。多次调用db_set即追加新内容到文件末尾。因此当多次更新同一 K 时,需要使用 sed | tail -n 1 查找末尾最新的值。
劣势是如果日志文件保存了大量记录,db_get 每次会从头至尾扫描一遍,时间复杂度O(N),性能比较差。因此引入了新的数据结构索引,加速查询。
哈希索引
主要思想是内存中维护一个哈希表记录所有K,Value 保存在磁盘日志文件中。每当向日志文件追加记录时,级联更新内存哈希表的Value偏移量。当查找某个值时,使用哈希表找到文件的偏移量即磁盘存储位置,这样通过一次磁盘寻址,就可以将 value 从磁盘加载到内存。适合 K 不多且更新频繁的情况。哈希索引提供了高性能的读写。
劣势是:
- 不适合大量K的情形,因为哈希表的K必须全部放入内存中,原则上允许在磁盘上维护哈希表,但这意味着查找值时需要大量磁盘随机访问IO。且哈希冲突时,需要复杂的处理逻辑。
- 区间查询效率不高。只能采取遍历的方式查找K。
SSTables 和 LSM-Tree
SSTable 又称排序字符串表,即按键对KV对排序