天池数据库初赛经验


赛题分析

实现一个只支持插入和查找的key-value store。
服务器配置:

  1. 8核
  2. 32G DRAM
  3. 126G PMEM(实际约100G)
  4. 256G SSD(实际约220G)
    测试操作:
  5. 随机写入:50个线程并发随机写入,每个线程使用write各写100万次随机数据
  6. 随机读取:50个线程并发随机读取,每个线程各使用read读取100万次随机数据,其中查询pk/uk/sk的比例为2:2:1
  7. 写入总数据量约为12GB

写操作的实现

存储表结构定义
id int64, user_id char(128), name char(128), salary int64
pk : id 			  //主键索引
uk : user_id 		//唯一索引
sk : salary			//普通索引

在写入时除了写入数据还需要写入索引。前面知道存储是明显够用的,100G的PMEM容量明显大于12GB的总写入量,这种情况下哈希表的性能最好。
一个简单的选择是将索引和数据放在一起,key是用来查找的值,value是查找得到的user数据。由于在user_id和salary的索引上也放user数据的话数据将被额外复制两份,浪费存储空间,也会很大程度上减慢写入的速度,因此user_id和salary的索引上存储的是id的值,查找时需要额外查找id的索引得到最终的结果。
大概是这样

image-20220824111347227

经过测试,这样的实现并没有带来很好的性能,原因可能有:

1.

正确性的保证


Author: 蒋璋
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 蒋璋 !
 Previous
pwrite pwrite
2022-09-14 蒋璋
Next 
v8 v8
2022-04-22 蒋璋