【问题标题】:logstash with huge mysql result set具有巨大 mysql 结果集的 logstash
【发布时间】:2019-06-13 14:39:47
【问题描述】:

我正在处理从 MySQL 到 elasticsearch 的复制数据,所以我正在使用 logstash 进行复制,但问题是在 mysql 中有一个产品表有很多关系,并且选择查询包含 46 个左外连接,因此返回了结果非常巨大,它只为表产品的单个记录返回大约 50000(50k)行,这使得复制性能很慢,所以我需要询问是否有其他解决方案可以进行复制以及如何解决巨大的性能问题结果

产品样本及其关系(不是全部):

这就是弹性搜索映射:

【问题讨论】:

  • 在不了解太多细节的情况下(您不显示 MySQL 表或 Elastic 索引结构),但有没有办法分步进行此复制,即小批量?
  • 好的,我已经更新了我的问题
  • 看起来不错。如果@huglap 的答案有助于您的工作,请不要忘记将其标记为正确。

标签: mysql elasticsearch logstash-jdbc


【解决方案1】:

您需要利用 mysql 中的 json datatype。这里的范例是在实际索引过程之前处理所有这些漂亮的数据。您运行一个存储过程来处理数据并将其存储在一个大的平面表中。您的所有关系都存储为 json 字段中的 json 对象(当然,当它有意义时)。然后在 elasticsearch 中将这些关系索引为nested datatypes。然后,您可以对其进行聚合以获得所需的结果。像魅力一样工作!

例如:

INSERT prod.id,
...,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('color', color, 'size', size)) FROM tag_products where prod.id = tprod.product_id) AS tag_product_as_json,
INTO Elastic_Products FROM Products AS prod
LEFT JOIN tag_product AS tprod ON prod.id = tprod.product_id
...

我更喜欢 SQL Server,如果您发现语法有任何错误,请见谅。 tag_product_as_json 将是 json 数据类型,并且将包含具有相同 product_id 的所有行。你可以在那里存储很多行。 这个例子非常基础。您可以使用公用表表达式以更节省内存的方式获得类似的结果,但它更复杂并且超出了本主题的范围。

【讨论】:

  • 感谢您的帮助,但请给我一个例子或场景
  • 我已经编辑了我的答案。请记住,我实际上从未在 MySQL 中做过,但在 SQL Server 中做过无数次。我很确定上面的例子会起作用。您基本上对查询结果进行编码并将其提取到 json 字段中。希望对您有所帮助。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 2023-03-06
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多