|批量随机键值的查询优化( 四 )


A2:判断为当前系统时间是否为月初 。
B2:若是月初 , f.reset 函数将补文件有序归并到主文件 , 同时清空补文件 , 并更新索引 。
A3:每天对补文件进行归并运算 , append 的 @a 代表归并追加到补文件上 , 若没有补文件则自动创建 , 并更新索引 。
多个文件时 , 利用补文件追加数据:
|批量随机键值的查询优化
本文插图

查找时 , 代码不变 。 open 函数 , 当存在补文件时 , 会连带补文件的数据一同查找 。
六、 索引冗余
同一份数据不能在遍历运算(通常为列存)和随机取数(通常为行存)这两方面都达到最优性能 。 如果这份数据还想用于遍历运算 , 可以把数据冗余多份 , 以空间换时间 。
6.1 举例
|批量随机键值的查询优化
本文插图

对需要遍历的数据 , 通常采用列存 。 SPL 中创建列存组表 , 只需要将 f.create@r 的 @r 去掉 , 就是以列存方式创建组表 。
对于列存组表 , 在建立索引时 , 还可以建立带值索引 , 把需要获取的数据复制进索引 , 基于以上的数据结构:
|批量随机键值的查询优化
本文插图

对于多字段键的场景 , 组表建索引时 , 对应参数部分也有类似的写法:index(ids_data_idx;id1,id2,…,idN;data1,data2,…,dataN) 。
【|批量随机键值的查询优化】SPL的带值索引的查询与不带值索引使用一样 。 需要注意的是 , 使用带值索引 , 读取数据时将不再访问原数据文件 , 取数速度会更快 。 但是另一方面 , 因为在索引中做了冗余 , 索引文件也会较大 。


推荐阅读