我有以下格式的庞大数据集(约 10 亿条记录)
|KEY(varchar(300),UNIQE,PK)|DATA1(int)|DATA2(bool)|DATA4(varchar(10)|
目前数据存储在 MySAM MYSQL 表中,但问题是关键数据(12G 表大小中的 10G)存储了两次——一次在表中,一次作为索引。(数据仅追加,表上永远不会有 UPDATE 查询)
有两个针对数据集的主要操作:
- contains - 简单检查是否找到密钥
- count - 根据数据字段的聚合(主要)功能
有没有办法只存储一次关键数据?
我的一个想法是将数据库放在一起,然后简单地创建 2-5 个字符的文件夹结构。这就是为什么分配给键“thesimon_wrote_this”的数据将存储在 fs 中的原因
~/data/the/sim/on_/wro/te_/thi/s.data
这样,数据集将像 btree 一样运行,“包含”和数据检索功能几乎可以在 O(1) 中运行(具有明显的 HDD 限制)。
这使得备份非常容易(仅备份具有 A 属性的文件),但聚合功能变得几乎无用,因为我每次需要 grep 10 亿个文件。分配单元大小无关紧要,因为我可以调整文件结构,以便只占用 5% 的磁盘空间而不使用。
我很确定还有另一种更优雅的方法可以做到这一点,我无法谷歌搜索:)。