我正在尝试从类似的表中删除记录
DELETE * FROM table WHERE x=1 LIMIT 200000;
当我检查我的bin日志时,它显示此delete语句分解为更小的块,如:
sql(0):
336 records
sql(1):
336 records
这在我的复制中造成峰值。有什么主意为什么要对数分解成小块?对于我正在使用laravel的框架
答案 0 :(得分:0)
MySQL DELETE不分块,这就是为什么分块是手动完成的原因。
您正在使用基于行的复制;基于语句的复制不会引发此问题,尽管它可能还有其他缺点-手册中讨论了RBR与SBR的优缺点。
除非您要在Laravel as described here中进行分块,否则没有理由应该得到这种行为。可能发生的情况是您的行和very small max_allowed_packet_size很大,因此服务器正在按块发送删除消息以使其适合数据包:
基于行的复制当前发送所有列和列值 用于从主机到从机的更新行,包括的值 更新未实际更改的列。这意味着, 使用基于行的方法复制大列值时 复制,则必须注意将
max_allowed_packet
设置得足够大 容纳要复制的任何表中的最大行,即使 您仅复制更新,或者仅相对插入 小值。
另一方面,表上的RBR和删除(除非它具有主索引)是复制的大屠杀;到那里去做,看到奴隶无动于衷的样子吓坏了。您想要删除块;可能需要调整块大小或添加延迟。
有关某些方法,请参见this answer。