我有一组整数数据。第一个是数字0,最后一个是47055833459.这些数字从第一个到最后一个有20亿个,它们永远不会改变或被添加到。 mysql表中唯一的插入是将这些数据加载到其中。从那以后,它只会被读取。
我预测数据库表的大小大约为20Gb。我计划有两列:
id, data
Id将是主键,自动递增无符号INT,数据将是无符号BIGINT
使用这两列优化此数据的最佳方法是什么?我已经看过其他类似的问题,但它们都考虑了写入速度和不断增加的表格。我使用的主机不支持MySQL分区,所以不幸的是,目前这不是一个选项。如果事实证明分区是唯一的方法,那么我将重新考虑一个新的主机。
该表只能由id列访问,因此不需要在数据列上有索引。
总而言之,在MySQL中处理具有两列的20亿行的表的最佳方法是什么,没有分区,针对读取进行了优化?
答案 0 :(得分:2)
假设您使用的是InnnDB,您应该只需:
CREATE TABLE T (
ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
DATA BIGINT UNSIGNED
);
这将有效地创建一个大B树而不是其他任何东西,并且可以在单个索引seek 1 中完成按ID检索行。请查看"Understanding InnoDB clustered indexes"以获取更多信息。
1 没有表堆访问权限,实际上根本没有堆。
答案 1 :(得分:0)
像这样定义你的表。
CREATE TABLE `lkup` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`data` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`id`, `data`)
)
复合主键将消耗磁盘空间,但会使查找速度非常快;只需阅读索引(称为覆盖索引)即可满足您的查询。
并且,当您将静态数据加载到其中时,请执行OPTIMIZE TABLE lkup
。这可能需要一段时间,但它会在运行时获得巨大收益。