请教各位:
当mysql表中数据存在上亿条时,使用logstash同步表中数据到ES,而且使用jdbc_paging_enabled分页时,其是直接将原sql语句作为子查询,拼接offset和limit来实现。当查询出的结果集较大时存在深度分页瓶颈。
日志如下:
可以看到一次查询花费几千秒。
当查询出的结果集较小时,比如几百万时,则只要花费几十秒。
请问各位,有什么好办法提高logstash在数据量较大情况下的查询效率吗,现在测试表中生成了一亿条左右数据,但是当logstash从mysql中查询数据实在是太慢了,几千秒才能查出一次数据,请问有什么好的方式增加速度吗?或者有没有大神做过类似场景的测试,请大神指教。
当mysql表中数据存在上亿条时,使用logstash同步表中数据到ES,而且使用jdbc_paging_enabled分页时,其是直接将原sql语句作为子查询,拼接offset和limit来实现。当查询出的结果集较大时存在深度分页瓶颈。
日志如下:
可以看到一次查询花费几千秒。
当查询出的结果集较小时,比如几百万时,则只要花费几十秒。
请问各位,有什么好办法提高logstash在数据量较大情况下的查询效率吗,现在测试表中生成了一亿条左右数据,但是当logstash从mysql中查询数据实在是太慢了,几千秒才能查出一次数据,请问有什么好的方式增加速度吗?或者有没有大神做过类似场景的测试,请大神指教。
7 个回复
hexiaohong
赞同来自: laoyang360 、446978780@qq.com 、lz8086
1.给updated_ts时间字段加上索引。
2.分批处理原则
(1)你的SQL:每批处理100000个
SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000;
(2)logstash分页的时候每次处理50000个
SELECT * FROM (SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000) AS `t1` LIMIT 50000 OFFSET 0;
SELECT * FROM (SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000) AS `t1` LIMIT 50000 OFFSET 50000;
(3)处理两次就写一个最后一条记录的updated_ts时间到指定文件。下一个定时任务启动的时候进行循环处理就行,因为每批处理updated_ts都会改变
xiaoke - http://blog.51cto.com/kexiaoke
赞同来自: 446978780@qq.com
lunatictwo
赞同来自: xiaoke
Jea - 一只猿
赞同来自: cccthought
有主键的话:
假设步长10000
zhangyufu - 学习使我快乐
赞同来自:
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自:
wajika
赞同来自: