0

我必须每天跟踪不同资源组合的价值。因此,执行此操作的表可能如下所示:

CREATE TABLE `data` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `datetime` DATETIME NOT NULL,
  `res1` INT UNSIGNED NOT NULL,
  `res2` INT UNSIGNED NOT NULL,
  `res3` INT UNSIGNED NOT NULL,
  `res4` INT UNSIGNED NOT NULL,
  `res5` INT UNSIGNED NOT NULL,
  `value` DECIMAL(10,0) NOT NULL,
  UNIQUE INDEX `datetime_res1_to_res5` (`datetime`, `res1`, `res2`, `res3`, `res4`, `res5`)
)

其中res1through tores5是它们各自表的外键。

该表将包含很多行——将轻松破解 2000 万行。

我很好奇的是我是否应该将外键组合放入一个单独的表中,这样我就有两个这样的表:

CREATE TABLE `data` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `datetime` DATETIME NOT NULL,
  `superKeys_id` INT UNSIGNED NOT NULL,
  `value` DECIMAL(10,0) NOT NULL,
  UNIQUE INDEX `datetime_superKeys_id` (`datetime`, `superKeys_id`)
)

CREATE TABLE `superKeys` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `res1` INT UNSIGNED NOT NULL,
  `res2` INT UNSIGNED NOT NULL,
  `res3` INT UNSIGNED NOT NULL,
  `res4` INT UNSIGNED NOT NULL,
  `res5` INT UNSIGNED NOT NULL,
  UNIQUE INDEX `res1_to_res5` (`res1`, `res2`, `res3`, `res4`, `res5`)
)

哪里datasuperKeys_id是 的外键superKeysid.

这将显着减小表的大小。但由于我不知道的原因,我不确定这是否是一个坏主意。显然,选择将需要一个连接来获取数据的细分,这会增加一点开销,但我不认为这会是一个问题。

在我的实际情况中,其中一个资源是 user_id 并且我经常需要对用户的值求和,所以我可能会保留这样一个列data而不是为了不让它成为superKeys表的一部分加入每个查询。然后,仅当我需要对其他资源的值求和时才使用连接,这些资源将不那么频繁。

4

1 回答 1

1

它不会减少数据的大小。您必须在一个表中存储 2000 万行数据,在另一个表中存储 2000 万行超级键。

五个整数是 40 个字节。乘以 2000 万--800 兆字节,加上一个日期时间列和一个小数。整张桌子可以放入我上网本的 RAM 中。

保留表“数据”。删除代理键。

于 2013-02-12T00:41:44.900 回答