【问题标题】:Most space efficient way to store 200 million records?存储 2 亿条记录的最节省空间的方法是什么?
【发布时间】:2016-05-06 16:55:42
【问题描述】:

我有这种记录:

  1. 名称 varchar(128)
  2. 说明 varchar(64)
  3. 字段 varchar(32)

(名称、描述)的组合必须是唯一的,并且需要为 名称 编制索引以便快速搜索/检索。更新不频繁,但很大,例如我可能一次添加 100 万条记录,但全天有大量读取。

我有超过 2 亿条这样的记录,未来可能会变成 300 条,当我尝试将它添加到 MySQL 时,DB 已经变得非常庞大,我正在查看 200GB+ 以及所有索引等。有没有节省空间的方法来构造这些数据。任何数据库技术都适合我,只要它不需要大量内存并且使用更少的磁盘。

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

谢谢,提前!

【问题讨论】:

  • 您的索引是否碎片化?对于 2 亿行的新表来说,这听起来有很多空间
  • 2 亿 * (128+64+32) = 50GB 数据。不知道 MySQL 如何存储数据,但我猜它为唯一键(124+64)创建了一个索引,所以我们已经在谈论 50GB + 索引 40Gb 的数据。我假设索引是碎片化的,这会增加更多空间。我正在尝试降低存储成本,因为文件越大,服务器空间、复制和备份的成本就越高。
  • 90GB 不是那么大。如果您对磁盘大小有疑问,请尝试使用 tokuDB 或使用 InnoDB 的压缩格式。
  • 您是否需要在关系数据库中存储非关系信息?您对这些数据进行了哪些类型的查询?
  • 我对其他数据库持开放态度。 99% 的查询执行非常简单的查找。只要它可以处理来自多个进程的同时查找。

标签: mysql database sqlite


【解决方案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;

【讨论】:

  • 谢谢,将尝试 MySQL 技术,并返回结果。
  • 谢谢,以下工作,为了测试,我添加了一百万条记录,经检查,它占用的空间比我预期的多 50%,但在对表进行优化调用后,它缩小到我期望的大小。优化表test_db.MySQLTable OK 0.000 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多