我有一个代码需要插入到mysql表中。我正在使用innodb存储引擎。可能会有并发客户端插入到tableat时间。我的插入查询有时需要长达50秒的时间才能插入。我看到锁定时间很少,但是执行时间却很大。以下是慢查询日志中捕获的时间:
查询时间:51.106628锁定时间:0.000043发送的行数:0已检查的行数:0
下面是我缩小的范围: 1.并发插入之间不能存在争用,因为mysql插入可以使用间隙锁,但是这里的表具有自动递增的主键。 2.我已设置在每次事务提交后刷新到磁盘的位置,因此不可能出现刷新可能滞后导致插入停止的情况。
我尝试保留两列表,其中一列是自动递增的PK,另一列只是一个字符串列。我运行了100个线程以插入到表中,而我的慢速查询日志捕获了很少的插入,大约需要10秒钟,而通常情况下插入需要花费几毫秒的时间,所以这似乎是偶尔出现慢速插入的普遍问题。
(来自评论)
偶尔的延迟问题也发生在非常简单的结构中。例如。
CREATE TABLE test_con_insert (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
thread int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into test_con_insert (thread) values(1);
慢速查询日志:#查询时间:10.014465锁定时间:0.000035 Rows_sent:0 Rows_examined:0插入到test_con_insert(thread)值(3833);用于在此表中插入的100个并发线程。捕获了4个慢查询。