最好的方法,将更改和未更改的值存储到MySql数据库中

时间:2014-03-02 14:43:43

标签: mysql database-design

我有一个MySql表,它将包含大量数据(> 100万行),每分钟可能有100个插入,由两个java应用程序填充和读出。 我想知道构建表格的最佳方法。大约有10列代表10次测量。如果其中一个测量没有改变,我不想再插入它,所以我不会不必要地填充我的表。 澄清:

col1  clo2  col3  col4
10    34    78    235
-1    5456  345   234
23    347   -1    -1

在这个例子中,我只是为“未更改”插入了-1。这个结构的问题:如果我想获得最后一个数据集,我必须做很多合并,而且我担心性能。所以问题是:这是正确的方法吗?

我当然可以选择插入上每列的最后一个值并再次插入,但是每个插入都需要许多选择 - >再次,不是很有效率。

我还想过一个只存储键值对的表:

col1  col2
val1  10
val2  34
val3  78
val4 235
val2  5456
....

不确定这是否是一种合适的方法,因为我没有一个数据集< - >一个完整的测量链接,而且该表看起来有点“混乱”。

您更喜欢哪种方式,或者您将如何区别?

1 个答案:

答案 0 :(得分:-2)

插入-1不会为您节省任何空间或记忆。如果列是INT,无论是null,-1还是实际值,那么您在磁盘和内存上使用相同的空间。

我认为你需要知道改变矩阵将如何随意改变矩阵的价值。如果有很多未更改的值,则键值对是可行的方法。如果没有,你可能会占用更多的空间,因为键列所需的char(4)使用等效空间一个整数,所以你将为你改变的每个空间使用2倍的空间。

在您的示例中,未更改的字段相对较少,因此将“双倍空间/内存”作为键/值进行跟踪的额外成本将是总和损失。

顺便说一句,我使用的表格不仅仅是整数,而且数以千万计的行总是在3-4 Gb的范围内。虽然进行表格更改成本很高,但如果在表格或时间戳上粘贴自动增量键,则使用sort desc,limit 1子句查找当前数据集应该非常快。

新颖的方法是每列保留seprate表,然后你就不需要用于查找的键。这将导致内存/磁盘占用空间最小。

在快速查找“last”值的任何一个中,您需要放置某种类型的时间戳或自动递增索引字段。

如果您从不在SQL查询中直接使用连接或加权中的这些列,并且您的首要关注是内存/磁盘footpring,那么最后一个选项是将所有值存储在单个varchar列中作为分隔字符串,如' 123,22,333,1' 。对于大数字,这会占用大量空间并且不值得,但是如果你的数字小于5位数或者它可能会输出,因为它是每个字符1个字节(数字和包括逗号)加一个varchar开销。