使用canal给rds和es同步,查询记录中使用distinct() ,没有报错,但是没有同步行为了-[阿里云_云淘科技]

如题,由于原语句有业务数据就改为使用官方的实例进行提问了。官方对于一对多的语句样例为:

select
a.id as _id,
a.name,
a.role_id,
c.labels,
a.c_time from user a
left join (select user_id, group_concat(label order by id desc separator ‘;’) as labels from label
group by user_id) c on c.user_id=a.id

这里存在一个缺点是子表虽然有id字段的索引,但是由于作为join字段的同时也作为group条件,实际上是数据表全遍历的,通过explain就可以看到。实际业务表现很慢,无法满足真正的业务。我将查询优化。

select
a.id as _id,
a.name,
a.role_id,
group_labels(c.user_id),
a.c_time from user a
left join label c on c.user_id=a.id

这样是提高了速度,但是返回的多条子记录会加大了wirteout的压力,于是再次优化为:
select
disntinct(a.id) as _id,
a.name,
a.role_id,
group_labels(c.user_id),
a.c_time from user a
left join label c on c.user_id=a.id

结果同步没有报错,没有任何信息输出,及时打开到trace级别也是没有信息输出。看了源代码也没有看到什么问题,请问是什么原因吗?

canal deploy: 1.1.5

以下为热心网友提供的参考意见

根据您提供的信息,我猜测问题可能出在Canal部署版本上。您提到使用的是Canal 1.1.5版本,而这个版本可能存在一些已知的问题。建议您尝试升级到较新的Canal版本,例如2.0或更高版本,看看是否能解决问题。

另外,您可以尝试以下方法来优化查询性能:

  1. user表的id字段添加索引,以加速连接操作。
  2. label表的user_id字段添加索引,以加速连接操作。
  3. 考虑使用分区表,将数据按照某个字段(如user_id)进行分区,以提高查询性能。
  4. 如果可能的话,尝试调整数据库的配置参数,例如增加缓冲区大小、调整连接数等,以提高查询性能。

以下为热心网友提供的参考意见

楼主你好,在使用canal同步阿里云RDS和ES时,如果查询记录中使用了distinct(),而同步行为停止,可能是由以下原因引起:

  1. canal无法正确解析distinct()函数:canal在解析SQL语句时可能无法正确处理distinct()函数,导致同步停止。

  2. distinct()函数导致同步数据量过大:使用distinct()函数可以确保查询结果中没有重复的记录,但是可能会导致同步的数据量变得非常大,从而增加了写入ES的压力。

  3. canal配置不正确:检查一下canal的配置是否正确,特别是源数据库和目标ES的配置参数是否正确设置。

本文来自投稿,不代表新手站长_郑州云淘科技有限公司立场,如若转载,请注明出处:https://www.cnzhanzhang.com/21218.html

(0)
匿名
上一篇 2024年1月10日 下午4:59
下一篇 2024年1月10日

相关推荐

新手站长从“心”出发,感谢16年您始终不离不弃。