【问题标题】:Optimize loading time in MySQL Database优化 MySQL 数据库中的加载时间
【发布时间】:2016-11-22 10:38:36
【问题描述】:

我有大量数据从 ETL 工具加载到数据库中。有时 etl 工具会生成一些不寻常的数据并将它们放在一个表中,比如为了简单起见,我想在我的数据库中填充 5 个正确的数据并得到 10 个作为结果,所以我检测到不一致。

作为将数据更新到我想要的状态的选项,我必须在我的控制下再次从 ETL 工具中截断 MySQL 数据库中的模式和插入数据。在这种情况下,一切看起来都不错,但是重新加载数据需要花费太多时间。

我调查了这个问题,发现删除数据并再次插入它需要更多时间,例如使用查询 INSERT…..ON DUPLICATE KEY UPDATE。所以我不需要删除所有数据,只需要在必要时检查和更新即可,这样可以节省我的加载时间。

我想使用这个查询,但我有点困惑,因为这些额外的 5 个错误数据已经存在于我的数据库中。如何在插入之前删除它们而不删除表中的所有内容??

【问题讨论】:

  • 你能显示数据吗
  • 很遗憾我不能在这里显示数据,但我可以说它的大小,大约 8GB
  • 所以它们是帽子数据的一些唯一键,您可以通过它对该数据使用删除条件
  • 我想过写一个删除数据的查询,这不受我之前的 INSERT.....ON DUPLICATE KEY UPDATE 查询的影响,但我不确定是否可以使用 SQL,需要也检查一下。
  • 你必须让一个列成为唯一的键,这样它就不会重复了

标签: mysql etl talend


【解决方案1】:

正如你所说的

“有时etl工具会生成一些不寻常的数据,并把它们放在里面 一张桌子”

您需要调查您的 ETL 代码并更正它。它不应该生成任何数据,ETL 工具仅根据规则转换您的数据。专注于 ETL 代码而不是 MySQL 数据库。

【讨论】:

    【解决方案2】:

    在我看来,您的 ETL 工具中的数据流设置存在问题。你没有说你正在使用什么,但我会回顾选择标准并查看你选择的字段以及你的 WHERE 标准。也许您的 WHERE 语句中的内容导致了额外的数据。

    至于 INSERT...ON DUPLICATE KEY UPDATE 语法,请确保 InnoDB 表中没有 AUTO_INCREMENT 列。因为在这种情况下,只有 INSERT 会增加自动增量值。并检查您的表是否没有多个唯一索引,因为如果您的 WHERE a=xx 匹配多行,则只会更新 1 行。 (MySQL 5.7,参见参考手册:https://dev.mysql.com/doc/refman/5.7/en/。)

    如果您发现您的 ETL 工具没有提供足够的灵活性,那么您可以研究其他选项。这是一篇好文章comparing ETL tools

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2010-12-12
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2015-12-23
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多