【问题标题】:Strategies for large databases with changing schemas具有变化模式的大型数据库的策略
【发布时间】:2017-05-16 01:49:19
【问题描述】:

我们有一个有数亿行的mysql数据库表。我们在对其执行任何类型的操作时遇到问题。例如,在任何可预测的时间范围内都无法添加列。当我们想要推出一个新列时,“ALTER TABLE”命令需要很长时间,所以我们不知道维护窗口是什么。

我们并没有将这些数据保存在 mysql 中,但我想知道是否有针对 mysql 或一般数据库的策略,用于更新大型表的模式。

我不太喜欢的一个想法是使用旧架构和附加列创建一个新表,然后针对合并结果的视图运行查询,直到所有数据都可以移动到新表架构。

现在我们已经遇到了基于 where 子句退出错误删除大量记录的问题。

想法?

【问题讨论】:

  • 对于 DBA Stack Exchange 来说可能是一个更好的问题。

标签: mysql database entity-attribute-value bigdata


【解决方案1】:

在 MySQL 中,您可以使用实体-属性-值模型创建新表。这将使每个实体和属性有一行,而不是将属性放在新列中。

这对于稀疏数据特别有用。注意事项:类型是有问题的(一切都倾向于变成字符串),并且您不能定义外键关系。

EAV 模型对于稀疏值特别有用——当您的属性仅适用于最少数量的角色时。它们可能对您有用。

在 NOSQL 数据模型中,添加新属性或属性列表更简单。但是,与其他行中的属性没有关系。

【讨论】:

  • 实体-属性-值模型会使检索速度太慢。一切都将是一个巨大的加入。我们已经考虑了常规列中的公共字段,以及用于任意属性的 json blob,但 json 的空间效率不是很高。另一种可能的选择是迁移到列式数据库,但我不确定这会如何影响性能。很难做一个苹果与苹果的比较。
【解决方案2】:

列式数据库(至少是 MariaDB 中的那个)在空间上非常节省——有人说比 InnoDB 小 10 倍。对于 100M 行来说,仅此一项收缩可能是值得的。

您尚未解释您的数据是否稀疏。如果是这样,JSON 的空间成本不会那么高——完全忽略任何缺失的“字段”;零空间。对于几乎所有其他方法,丢失单元格至少会产生一些开销。

按照您的建议,对常用字段使用常规列。但也适用于您可能搜索的主要字段。然后把剩下的扔进 JSON。

我喜欢(在客户端)压缩 JSON 字符串并使用BLOB。与使用未压缩的 TEXT 相比,这将缩小 3 倍。

我不喜欢每属性一行 EAV 方法;它在太空中非常昂贵,JOINs 等。

[更多想法]关于 EAV。

尽可能避免ALTER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多