首页 > 解决方案 > 为什么mysql插入行需要很长时间?

问题描述

我有一个代码需要插入到 mysql 表中。我正在使用 innodb 存储引擎。可能有并发客户端插入到 tableat 时间。我的插入查询有时需要长达 50 秒才能插入。我看到锁定时间非常少,但执行时间非常长。以下是慢查询日志中捕获的时间:

Query_time:51.106628 Lock_time:0.000043 Rows_sent:0 Rows_examined:0

谁能解释一下mysql在哪里花费这么多时间插入表中,通常需要以毫秒为单位的时间。

以下是我缩小的范围: 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);

慢查询日志:#Query_time:10.014465 Lock_time:0.000035 Rows_sent:0 Rows_examined:0插入test_con_insert(thread)值(3833);用于在此表中插入的 100 个并发线程。捕获了 4 个慢查询。

标签: mysqlinnodb

解决方案


推荐阅读