Logstash具有巨大的mysql结果集

时间:2019-06-13 14:39:47

标签: mysql elasticsearch logstash-jdbc

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

具有相关关系(并非全部)的产品样本:

product with its relations

这就是elasticsearch映射:

elasticsearch mapping

1 个答案:

答案 0 :(得分: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的行。您可以在那里存储很多行。 这个例子很基础。您可以使用公用表表达式以更节省内存的方式获得类似的结果,但这更加复杂并且超出了本主题的范围。