没有主键/唯一索引的表上做影响行数较多的DML,用行复制,会导致slave lag(Seconds_Behind_Master)不断增加
原因:slave的sql thread在做执行计划的时候只会用主键和唯一索引作为候选可用索引
重现方式
# 表结构
CREATE TABLE `t2` (
`id` bigint(20) NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 初始化数据
插入15w行
# 更新:命中5W行
UPDATE `t2` SET `age` = CEIL(RAND()*1000) WHERE id<=50000;
# 结果
slave上的Seconds_Behind_Master值一直增加到N(原因)
# 源码
Log_event.cc
bool slave_execute_deferred_events(THD *thd)
{
bool res= false;
Relay_log_info *rli= thd->rli_slave;
DBUG_ASSERT(rli && (!rli->deferred_events_collecting || rli->deferred_events));
if (!rli->deferred_events_collecting || rli->deferred_events->is_empty())
return res;
res= rli->deferred_events->execute(rli);
return res;
}