我有这种记录:
(名称,描述)的组合需要是唯一的,名称需要编入索引以便快速搜索/检索。更新很少,但很大,例如我可能一次添加100万条记录,但全天都有大量读取。
我有超过2亿条这样的记录,将来可能会变成300条,当我尝试将它添加到MySQL时,数据库已经变得非常庞大我正在寻找200GB +所有索引等等。是否有空间有效的方式构建这些数据。任何DB技术对我都没关系,只要它不需要大量的ram并且使用更少的磁盘。
2亿*(128 + 64 + 32)= ~50GB的数据。不知道MySQL如何存储数据,但我猜它会为唯一键创建一个索引(124 + 64),所以我们已经在讨论 50GB + ~index 40Gb 的数据了。还有一些其他开销,可能是由于下面建议的碎片化。
先谢谢!
答案 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;