MySQL,20亿行数据,只读,性能优化?

时间:2013-08-14 23:11:55

标签: mysql optimization database-design query-optimization database-performance

我有一组整数数据。第一个是数字0,最后一个是47055833459.这些数字从第一个到最后一个有20亿个,它们永远不会改变或被添加到。 mysql表中唯一的插入是将这些数据加载到其中。从那以后,它只会被读取。

我预测数据库表的大小大约为20Gb。我计划有两列:

id, data

Id将是主键,自动递增无符号INT,数据将是无符号BIGINT

使用这两列优化此数据的最佳方法是什么?我已经看过其他类似的问题,但它们都考虑了写入速度和不断增加的表格。我使用的主机不支持MySQL分区,所以不幸的是,目前这不是一个选项。如果事实证明分区是唯一的方法,那么我将重新考虑一个新的主机。

该表只能由id列访问,因此不需要在数据列上有索引。

总而言之,在MySQL中处理具有两列的20亿行的表的最佳方法是什么,没有分区,针对读取进行了优化?

2 个答案:

答案 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。这可能需要一段时间,但它会在运行时获得巨大收益。