索引varchars而不复制数据

时间:2012-09-09 13:47:17

标签: mysql database

我有以下格式的(~10亿)记录的大量数据集

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

目前数据存储在MySAM MYSQL表中,但问题是密钥数据(12G表大小中的10G)存储了两次 - 一次存储在表中,一次存储为索引。 (数据仅附加在表上不会有UPDATE查询)

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

  1. 包含 - 简单检查是否找到密钥
  2. count - 根据数据字段聚合(主要)函数
  3. 有没有办法只存储一次密钥数据?

    我的一个想法是将数据库全部放在一起,只需创建2-5个char文件夹结构。 这就是分配给密钥“thesimon_wrote_this”的数据将存储在fs中的原因

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

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

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

    我很确定还有另一种 - 更优雅的方式,我不能把它谷歌出来:)。

1 个答案:

答案 0 :(得分:0)

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