通过实际测试又发现一个反直觉的案例: 当初为无主键无索引的表设计一个 append 方法,是想不需要通过折半查找算法直接就能把记录 append 到 btree 最后一个 leaf page,这样不用走正常的 put 方法,因为 put 方法需要事先自动生成一个 row key,然后通过折半查找算法定位所在的 leaf page。实际测试下来发现,如果是多线程批量写的场景,用 put 方法居然比用 append 方法快一倍,因为 append 方法总是写最后一个 leaf page,会快速造成多线程写冲突,而 put 方法因为要提前生成 row key,不一定会同时写到同一个 leaf page,所以反而降低了写冲突,反而更快了。
如果是多线程非批量写的场景,用 append 和 put 反而没什么区别,因为客户端逐条执行 insert 语句时,有先后的时间差,在后端执行 append 操作的线程本身冲突就小。
总之,设计 append 这个写入数据的方法看起来是多余的。
@zhh-4096
早上压测了一个网友给的老项目,批量写了600多万条记录,lealone 的性能居然只比 h2 快了20%,然后我回头再压测了一下我写的批量压测例子,批量写960万条记录明明快了两倍。太诡异了,可能我的字段少,表也有主键,没有主键的表实际上都是串行直接 append 到最后一个 page,发挥不了多线程的优势。
