mysql - 为什么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 个慢查询。
解决方案
推荐阅读
- c# - NLog/ SQLite 与 .NET Core
- ssis - 用于检查扩展名为 .dtsx 的 SSIS 包的 Sonarqube Xpath 规则
- ios - 需要有关在 iOS 中请求通知权限的说明
- javascript - 将后向正则表达式从 python 转换为 javascript
- schema.org - “Google 无法识别 Offer 类型的对象的属性权重”
- android - Android 布局预览未在 android studio 3.1.3 中加载
- mysql - /var/run/mysqld/mysqld.sock 安装 Bitnami(灯服务器)时不存在
- ruby-on-rails - case 语句需要在“then”中显式返回
- asp.net-web-api - 如何为 ASP.NET Boilerplate Web API 按版本设置动态路由?
- c++ - Go/C++ gRPC 客户端通道和存根生命周期