环境 canal 1.1.6,和配套的canal-adapter
sourceDB mysql5.7
targetDB potgre14
jdbc postgresql-42.6.0.jar
中间加了kafka,canal-server读出binlog后写入kafka,然后用canal-adapter读kafka,写入目标库。
问题:
在mysql5.7插入100条数据
insert into XX values ...(100条)
然后再删除它们
delete from XX where id between 1 and 100
用tail -f 观察canal-adapter的日志 adapter.log
插入动作在postgre端执行速度很快,眨眼的功夫就运行完了。
删除的动作在终端上可以明显观察到执行缓慢,大概每秒删除1-2条的样子。
同样的,update动作也不快,不知道是哪里有问题。
但在数据库工具中,即使用 delete from XX where id=1;delete from XX where id=2;这样的方式执行,速度也不慢。
另外作为对比,测试了target端是mysql时,delete和update的速度快很多,不知道postgre的问题出在哪里
2条答案
按热度按时间qlvxas9a1#
补充一下,不管source端下的sql是 delete from XX where id between 1 and 100
还是按id一条一条删除,
target端删除都很慢,两种方式的执行速度没有明显差异
xghobddn2#
再补充一下问题,表的PK是id,目标表有创建primary key,表里大约100万行数据。
经过测试发现,如果表内数据只有10万左右,删除和更新还是很快的;100万行时更新删除大约需要400ms左右。
经过追踪,发现确实是更新和删除动作执行sql慢。把SQL打印出来后,看到实际执行的SQL就是类似 DELETE FROM XX WHERE id=10001,数据类型正确,没有出现数据类型不匹配等问题,应该是能走索引的。
相关文件是com.alibaba.otter.canal.client.adapter.rdb.support.BatchExecutor.java。
其中 pstmt.execute() 这个步骤特别慢,大概就是400ms左右。
我不太懂java,网上找了下资料,说预编译有时候有问题,就先把它改成普通statement测了一下,发现执行速度从400ms变成了10ms以内,所以推测是预编译和postgre之间的问题。(毕竟接mysql的时候就没有性能问题)
更深入的问题我短期内大概也搞不定,希望哪位开发大佬能解答和修复下这个问题