做个测试:写入100万条:tcbtest write test.tcb 1000000,时间: 0.994秒 速度:1006036条/秒;写入200万条:tcbtest write test.tcb 2000000,时间: 2.028秒 速度: 986193条/秒;写入500万条:tcbtest write test.tcb 5000000,时间: 5.276秒 速度: 947687条/秒。
从测试来看,TCBDB写入速度虽然比TCHDB低45%左右,但可以看出,写入500万条数据时,B+Tree的写入速度保持稳定。
修改参数后,再测试:写入100万条: tcbtest write test.tcb 1000000 1024 2048 5000000,时间: 0.981秒 速度: 1019367条/秒;写入200万条: tcbtest write test.tcb 2000000 1024 2048 5000000,时间: 1.856秒 速度: 1077586条/秒;写入500万条: tcbtest write test.tcb 5000000 1024 2048 5000000,时间: 4.448秒 速度: 1124101条/秒。
TCBDB没有开启xmsiz扩展MMAP内存,写入大量数据时,速度仍然能够得以保证。
性能微调参数(C API):
bool tcbdbtune(TCBDB *bdb, int32_t lmemb, int32_t nmemb, int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts);
lmemb 用于指定被缓存的页级节点数
nmemb 用于指定被缓存的非页级节点数,通常为页级节点数的两倍
bnum 用于指定bucket array的数量。bnum的数量应该大于存储总记录数的1/128。
TCBDB(查找的时间复杂度为“O(log n)”)虽然速度比TCHDB (查找的时间复杂度为“O(1)”)慢一些,但是,它对内存的依赖度要比TCHDB小得多,随着数据量增大,写入速度也稳定,适合存储大量数据。
生产环境,我们存储7GB的数据, TCBDB只使用了160M的内存缓存,而TCHDB则需要设置7GB xmsiz内存才能保证速度。
实例:Tokyo Tyrant 的B+Tree数据库,优化参数如下:
ttserver -host 10.19.1.195 -port 11211 -thnum 4 -dmn -pid /data0/ttserver/ttserver.pid -log /data0/ttserver/ttserver.log -le -ulog /data0/ttserver/ -ulim 128m -sid 195 -rts /data0/ttserver/ttserver.rts /data0/ttserver/database.tcb#lmemb=1024#nmemb=2048#bnum=20000000
图:TCBDB B tree index