0

我有以下格式的庞大数据集(约 10 亿条记录)

|KEY(varchar(300),UNIQE,PK)|DATA1(int)|DATA2(bool)|DATA4(varchar(10)|

目前数据存储在 MySAM MYSQL 表中,但问题是关键数据(12G 表大小中的 10G)存储了两次——一次在表中,一次作为索引。(数据仅追加,表上永远不会有 UPDATE 查询)

有两个针对数据集的主要操作:

  1. contains - 简单检查是否找到密钥
  2. count - 根据数据字段的聚合(主要)功能

有没有办法只存储一次关键数据?

我的一个想法是将数据库放在一起,然后简单地创建 2-5 个字符的文件夹结构。这就是为什么分配给键“thesimon_wrote_this”的数据将存储在 fs 中的原因

~/data/the/sim/on_/wro/te_/thi/s.data 

这样,数据集将像 btree 一样运行,“包含”和数据检索功能几乎可以在 O(1) 中运行(具有明显的 HDD 限制)。

这使得备份非常容易(仅备份具有 A 属性的文件),但聚合功能变得几乎无用,因为我每次需要 grep 10 亿个文件。分配单元大小无关紧要,因为我可以调整文件结构,以便只占用 5% 的磁盘空间而不使用。

我很确定还有另一种更优雅的方法可以做到这一点,我无法谷歌搜索:)。

4

1 回答 1

0

考虑拥有一个固定宽度整数键,如 64 位整数,这似乎是一个非常好的主意。相比之下,存储搜索 varchar 键非常慢!您仍然可以在列上添加额外的索引以KEY进行快速查找,但它不应该是您的主键。

于 2012-09-09T13:56:31.397 回答