【问题标题】:best way, to store changed and unchanged values into MySql database最好的方法,将更改和未更改的值存储到 MySql 数据库中
【发布时间】:2014-03-03 00:33:51
【问题描述】:

我有一个 MySql 表,它将保存大量数据(>100 万行),每分钟可能有 100 次插入,由两个 java 应用程序填充和读取。 我想知道构造表格的最佳方法。大约有 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”表示“此列未更改”会不必要地用无效数据填充表格。

标签: mysql database-design


【解决方案1】:

插入 -1 不会为您节省任何空间或内存。如果该列是 INT,无论其为 null、-1 还是实际值,您都在使用相同数量的磁盘和内存空间。

我认为您需要知道更改矩阵在值不变的情况下的填充程度。如果有很多未更改的值,键值对就是要走的路。如果不是,您可能会占用更多空间,因为键列所需的 char(4) 使用整数等值空间,因此您将使用 2 倍的空间来更改每个值。

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

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

新颖的方法是每列保留单独的表,然后您不需要查找键。这将导致内存/磁盘占用最少。

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

如果您从未在 SQL 查询中直接在连接或计算中使用这些列,并且您的第一个问题是内存/磁盘占用空间,那么最后一个选择是将其所有值作为分隔字符串存储在单个 varchar 列中,例如 ' 123,22,333,1'。对于大数字,这会占用大量空间并且不值得,但如果您的数字少于 5 位,或者它可能会输出,因为它是每个字符 1 个字节(数字和包含逗号)加上一个varchar 开销。

【讨论】:

  • 我明白你的意思,但这仍然留下一个问题:这是正确的方法吗,因为选择最后一个数据集(这将经常完成)我必须单独选择每一列.而且我无法存储实际值,因为我没有它!并且为每个插入在每一列上进行选择不能是答案...
  • @SteffenNieuwenhoven 我还添加了一个新想法——每列单独的表——这将需要最少的内存/磁盘(除非您在它们上添加时间戳或索引)
  • 澄清一下,您是否建议 OP 将他的值存储在逗号分隔的列表中?
  • -1 建议在单个列中存储多个值。这违反了 1NF。
  • @FreshPrinceOfSO 只有在数据被关联使用时才违反 1NF。如果表中的列仅用作值存储,则概念、整数、char 等......是没有意义的,应用程序的特殊需求应该覆盖美学
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多