问题:
用logstash同步mysql数据到elasticsearch,原始数据有几千万条,发现过了几十万条之后,到了后面同步就特别慢,无法完成同步
原因:
statement => "select * from t_wechat_message where id > :sql_last_value"
logstash配置文件中会配置同步时需要执行的sql,sql_last_value是内置变量,我这里面记录的是每次同步之后的id的值,id是自增的,但是在真正执行sql的时候,开启分页的模式下,logstash会在statement外面包上一层查询
SELECT * FROM (select * from t_wechat_message where id > 20000000) AS `t1` LIMIT 500 OFFSET 100000;
如果当前批次需要同步的数据量特别大,就会导致offset特别大,offset特别大的时候,sql执行时间就特别长,导致无法完成同步
方案:
分批进行,每批量只执行100000条,这样offset最大值也只有100000,速度会大大提高
statement => "select * from t_wechat_message where id > :sql_last_value limit 100000"
或者
statement => "select * from t_wechat_message where id > :sql_last_value and id < (:sql_last_value + 100000)"