v5.3.3版本执行INSERT IGNORE偶发变慢

【TiDB 使用环境】生产环境
【TiDB 版本】v5.3.3
【复制黏贴 ERROR 报错的日志】
v5.3.3版本,执行insert ignore语句,会出现偶发变慢
SQL语句

INSERT
  IGNORE INTO xxxx_node_unique (
    id,
    sub_order_no,
    express_type,
    express_no,
    logistic_node
  )
VALUES
  (
    11111111111,
    '2222222222222222',
    'JJJJJJJJJJJJD',
    'DDDDDDDD444444444444444',
    '222222'
  );

执行计划

	id      	task	estRows	operator info	actRows	execution info                                                                                                                                                                                                                                                                         	memory   	disk
	Insert_1	root	0      	N/A          	0      	time:3.1s, loops:2, prepare: 417.9µs, check_insert: {total_time: 3.1s, mem_insert_time: 51.8µs, prefetch: 3.1s, rpc:{ResolveLock:{num_rpc:2, total_time:3.02s},BatchGet:{num_rpc:6, total_time:2.06ms}}}, commit_txn: {prewrite:711.6µs, region_num:3, write_keys:3, write_byte:229}	787 Bytes	N/A

这个 sql 完整慢日志发出来

prefetch耗时在读取,insert之前需要比较主键id是否存在,开事务提交或者多个values聚在一起试试

explain analyze试下

prefetch: 3.1s:从 TiKV 读取唯一索引数据耗时过长

ResolveLock:{num_rpc:2, total_time:3.02s} 锁冲突导致等待

如果有业务层代码,可以在代码里插入前判断一下是否已存在主键,避免使用IGNORE

replace into是否可以?

或者 insert on duplicate. 感觉都会判断原来的主键

因为索引造成。

可以尝试一下【编辑】功能,而不是不断追加新评哦~

INSERT IGNORE 必须逐行检查唯一约束(主键 / 唯一索引),若插入数据存在大量冲突,或唯一索引设计不合理(如长字符串唯一索引),检查耗时会激增;

这个问题解决了吗?

索引造成插入慢

减少唯一索引数量:insert ignore 会对所有唯一索引 / 主键 做冲突检查,唯一索引越多,检查越慢。只保留必要的唯一索引

这个性能也不太好呀