最节省空间的方式存储2亿条记录?

时间:2016-01-29 03:25:35

标签: mysql database sqlite

我有这种记录:

  1. 名称 varchar(128)
  2. description varchar(64)
  3. 字段 varchar(32)
  4. (名称,描述)的组合需要是唯一的,名称需要编入索引以便快速搜索/检索。更新很少,但很大,例如我可能一次添加100万条记录,但全天都有大量读取。

    我有超过2亿条这样的记录,将来可能会变成300条,当我尝试将它添加到MySQL时,数据库已经变得非常庞大我正在寻找200GB +所有索引等等。是否有空间有效的方式构建这些数据。任何DB技术对我都没关系,只要它不需要大量的ram并且使用更少的磁盘。

    2亿*(128 + 64 + 32)= ~50GB的数据。不知道MySQL如何存储数据,但我猜它会为唯一键创建一个索引(124 + 64),所以我们已经在讨论 50GB + ~index 40Gb 的数据了。还有一些其他开销,可能是由于下面建议的碎片化。

    先谢谢!

1 个答案:

答案 0 :(得分:1)

MySQL和SQLite都将文本值存储在动态大小的记录中;表或索引条目填充。

您可以通过将名称/描述列作为主键并因此使用聚簇索引(MySQL中的requires InnoDB或SQLite中的WITHOUT ROWID)来避免UNIQUE约束的索引所需的空间:

CREATE TABLE MySQLTable(
    name        VARCHAR(128),
    description VARCHAR(64),
    field       VARCHAR(32),
    PRIMARY KEY(name, description)
) ENGINE = InnoDB;

CREATE TABLE SQLiteTable(
    name        VARCHAR(128),  -- SQLite ignores the limits
    description VARCHAR(64),
    field       VARCHAR(32),
    PRIMARY KEY(name, description)
) WITHOUT ROWID;