这是对我的问题“有效存储 7.300.000.000 行”(有效存储 7.300.000.000 行)的跟进。
我决定将 MySQL 与分区一起使用,初步架构如下所示:
CREATE TABLE entity_values (
entity_id MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
date_id SMALLINT UNSIGNED DEFAULT 0 NOT NULL, # 2 bytes = [0 .. 65.535]
value_1 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
value_2 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
UNIQUE KEY (entity_id, date_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PARTITION BY HASH(entity_id) PARTITIONS 25;
这给出了:
- 行 = 7.300.000.000 行(根据上一篇文章中所述的要求)
- 大小/行 = 11 字节 (3+2+3+3)
- 总大小 = 7.300.000.000 行 * 11 字节 = 80.300.000.000 字节 = 80.3 GB
- Partitions = 25(3.2 GB/分区,分区大小有些随意)
请注意,我已经从原始设计中删除了主键,因为不会使用“id”列。
现在问我的问题 - 鉴于我之前的帖子中概述的要求和上面的架构,您对可以进行的进一步优化/调整有什么建议吗?或者考虑到我决定使用 MySQL,上述模式是否“最佳”?
更新:我尝试将当前数据集加载到上面的模式中,8.570.532 行占用了 212.000.000 字节的磁盘空间,每行大约 24.7 字节。
更新:请注意,覆盖 entity_id+date_id 的索引也将用于仅针对 entity_id 的查询。