我必须每天跟踪不同资源组合的值。因此,执行此操作的表可能如下所示:
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`)
)
其中res1
到res5
是其各自表的外键。
这个表将包含很多行 - 很容易破解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`)
)
其中data
。superKeys_id
是superKeys
的外键。id
。
这将显着减小表的大小。但由于我不知道的原因,我不确定这是不是一个坏主意。显然,选择将需要连接才能获得数据细分,这会增加更多的开销,但我不认为这会是一个问题。
在我的实际情况中,其中一个资源是user_id,我经常需要对用户的值求和,所以我可能会在data
中保留这样一个列,而不是让它成为superKeys
表,以便不必加入每个查询。然后,当我需要对其他资源的值求和时,只使用连接。
答案 0 :(得分:1)
它不会减小数据的大小。你必须在一个表中存储2000万行数据,在另一个表中存储2000万行超级密钥。
五个整数是40个字节。乘以2000万 - 800兆字节,加上日期时间列和小数。整个表格适合我的上网本中的RAM。
保持表格“数据”。删除代理键。