我有一个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
....
不确定这是否是一种合适的方法,因为我没有一个数据集< - >一个完整的测量链接,而且该表看起来有点“混乱”。
您更喜欢哪种方式,或者您将如何区别?
答案 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开销。