2

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

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

id, data

Id 将是一个主键,自动递增 unsigned INT 和 data 将是一个 unsigned BIGINT

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

该表只会被 id 列访问,因此数据列不需要索引。

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

4

2 回答 2

3

假设您使用的是 InnnDB,您应该简单地:

CREATE TABLE T (
    ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    DATA BIGINT UNSIGNED
);

这将有效地创建一个大的 B-Tree,仅此而已,并且可以在单个索引 seek 1中按 ID 检索一行。查看“了解 InnoDB 聚集索引”了解更多信息。


1没有表堆访问,实际上根本就没有堆。

于 2013-08-15T09:01:21.273 回答
0

像这样定义你的表。

CREATE TABLE `lkup` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `data` BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`, `data`)
) 

复合主键会消耗磁盘空间,但查找速度会非常快;只需读取索引(称为覆盖索引)即可满足您的查询。

并且,OPTIMIZE TABLE lkup在您完成将静态数据加载到其中时执行此操作。这可能需要一段时间,但它会在运行时获得巨大回报。

于 2013-08-14T23:36:43.323 回答