B+树关联数据文件存储顺序及单次查询数据加载量问题咨询
存储方案选型建议
两种方案没有绝对的优劣,完全取决于你的业务负载特征:
- 如果业务读多写少、范围查询占比超过20%,优先选择有序存储。范围查询、批量数据扫描的场景下,连续块读取带来的IO减少收益,远大于写入时的数据挪动开销。如果担心磁盘碎片问题,可以在业务低峰期做定期的离线数据重排整理,对线上服务影响极小。如果你的数据是固定长度的,有序存储的写入开销还会进一步降低,只需要挪动固定大小的槽位即可,不需要处理可变长度的空间调整。
- 如果业务写多读少、90%以上都是单值查询、范围查询需求极少,优先选择无序存储。追加写入是磁盘效率最高的写入模式,完全不需要挪动已有数据,非常适合日志、埋点这类写入压力远大于读取压力的场景。
节点数据加载策略
访问节点内单个条目的数据时,不需要默认加载整个节点到内存。B+树叶节点本身已经存储了每个键对应的数据指针(包含数据在文件中的偏移量和长度),直接根据指针读取对应偏移的固定长度数据即可,额外加载其他不相关的条目只会带来不必要的IO开销。只有当你明确接下来要访问同一个节点内的多个相邻键时,再一次性加载整个节点的所有数据即可。
单值
get查询的最优加载规则 纯单值查询场景下,最优的加载数据指针数量是1个。只需要加载目标键对应的数据指针指向的内容即可,多加载其他指针的数据只会浪费磁盘IO资源,反而拖慢查询速度。如果你的业务逻辑有明确的相邻访问特征(比如查询完当前键后大概率会查询下一个相邻键),可以额外预加载相邻1~2个指针的数据做预取优化,但这属于特定场景的可选优化,不是通用规则。
内容的提问来源于stack exchange,提问作者roat
相关产品推荐
相关产品推荐

