我们有一个包含数亿行的mysql数据库表。我们遇到了对它执行任何操作的问题。例如,添加列对于任何可预测的时间范围都变得不可能。当我们要推出一个新列时," ALTER TABLE"命令需要永远,所以我们不知道维护窗口是什么。
我们并不依赖于将这些数据保存在mysql中,但我想知道是否存在一般的mysql或数据库策略,用于更新大型表的模式。
我不喜欢的一个想法是创建一个包含旧模式和附加列的新表,并对视图进行查询,该视图将结果联合起来,直到所有数据都可以移动到新表模式。 / p>
现在我们已经遇到了基于where子句错误地删除大量记录的问题。
想法?
答案 0 :(得分:0)
在MySQL中,您可以使用实体 - 属性 - 值模型创建新表。每个实体和属性都有一行,而不是将属性放在新列中。
这对稀疏数据特别有用。注意:类型是有问题的(一切都会变成字符串),你不能定义外键关系。
当您拥有仅适用于最少角色数的属性时,EAV模型对稀疏值特别有用。它们可能对您的情况有用。
在NOSQL数据模型中,添加新属性或属性列表更简单。但是,与其他行中的属性没有任何关系。
答案 1 :(得分:0)
柱状数据库(至少是MariaDB中的一个)在空间上非常节俭 - 有人说比InnoDB小10倍。单独收缩可能非常值得100M行。
您尚未解释数据是否稀疏。如果是这样的话,那么JSON对于太空而言并不昂贵 - 完全不考虑任何领域'缺少的;零空间。几乎任何其他方法,至少有一些缺失细胞的开销。
如您所知,使用常规列来显示常用字段。但也适用于您可能要搜索的主字段。然后把剩下的部分扔进JSON。
我喜欢压缩(在客户端中)JSON字符串并使用BLOB
。与使用未压缩的TEXT
相比,这会减少3倍。
我不喜欢每行属性EAV方法的一行;它在太空中成本很高,JOINs
等等。
[更多想法]。
尽可能避免使用ALTER
。