GreatSQL 中 Insert 慢是什么情况?
GreatSQL中 Insert 慢是什么情况?
背景概述
客户反映,业务上某张表的 Insert 操作速度很慢,单条 Insert 语句的最大执行时间超过了 5 秒。在收到客户问题后,我们仔细检查了数据库状态以及主机的负载情况,发现目前一切正常,并没有发现数据库故障或主机负载过高导致 insert 操作变慢的问题。
因此,我们分析了慢日志,希望从中找出问题。经过分析,发现这条插入语句的query_time
和lock_time
几乎相同,因此怀疑是由于锁等待导致插入操作变慢。随后,我们捕获了通用日志,几乎同一时间这张表有update,insert
操作,发现由于更新操作阻塞了插入操作,导致插入速度下降的问题。这个更新操作所在的事务包含了多条 SQL 语句,因此如果该事务执行时间较长,就会阻塞插入操作,导致插入操作的执行时间延长。
问题复现
本次测试基于 GreatSQL-8.0.32-25,隔离级别为 RR
2.1 创建测试表
greatsql> CREATE TABLE `t11` ( `id` int NOT NULL, `c1` int DEFAULT NULL, `c2` int DEFAULT NULL, `c3` int DEFAULT NULL, `c4` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `c2` (`c2`,`c3`), KEY `c4` (`c4`) ); greatsql> insert into t11 values (1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(5,5,5,5,5);
2.2 事务执行顺序
时间 | 事务1 | 事务2 |
---|---|---|
T1 | BEGIN; | BEGIN; |
T2 | update t10 set c2=20 where c4=2; | |
T3 | insert into t10 values (6,2,2,2,2); | |
T4 | -- hang住,处于锁等待 | |
T5 | commit; | -- 锁等待结束 |
T6 | commit; |
2.3 事务1执行
greatsql> begin; greatsql> update t11 set c2=20 where c4=2;
查看加锁情况:
greatsql> select THREAD_ID,EVENT_ID,ENGINE_LOCK_ID,OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME,LOCK_TYPE,LOCK_MODE,LOCK_STATUS,LOCK_DATA from performance_schema.data_locks; +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+ | THREAD_ID | EVENT_ID | ENGINE_LOCK_ID | OBJECT_SCHEMA | OBJECT_NAME | INDEX_NAME | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA | +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+ | 55 | 20 | 140531661278568:44172:140531678523168 | test | t11 | NULL | TABLE | IX | GRANTED | NULL | | 55 | 20 | 140531661278568:43110:6:3:140531678129184 | test | t11 | c4 | RECORD | X | GRANTED | 2, 2 | | 55 | 20 | 140531661278568:43110:4:3:140531678129528 | test | t11 | PRIMARY | RECORD | X,REC_NOT_GAP | GRANTED | 2 | | 55 | 20 | 140531661278568:43110:6:4:140531678129872 | test | t11 | c4 | RECORD | X,GAP | GRANTED | 3, 3 | +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+ 4 rows in set (0.01 sec)
可以看到此时给【3, 3】这条数据加加了X,GAP锁
2.4 事务2执行
greatsql> begin; greatsql> insert into t11 values (6,2,2,2,2);
查看加锁情况:
greatsql> select THREAD_ID,EVENT_ID,ENGINE_LOCK_ID,OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME,LOCK_TYPE,LOCK_MODE,LOCK_STATUS,LOCK_DATA from performance_schema.data_locks; +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+------------------------+-------------+-----------+ | THREAD_ID | EVENT_ID | ENGINE_LOCK_ID | OBJECT_SCHEMA | OBJECT_NAME | INDEX_NAME | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA | +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+------------------------+-------------+-----------+ | 56 | 14 | 140531661279416:44172:140531678523936 | test | t11 | NULL | TABLE | IX | GRANTED | NULL | | 56 | 14 | 140531661279416:43110:6:4:140531678132256 | test | t11 | c4 | RECORD | X,GAP,INSERT_INTENTION | WAITING | 3, 3 | | 55 | 20 | 140531661278568:44172:140531678523168 | test | t11 | NULL | TABLE | IX | GRANTED | NULL | | 55 | 20 | 140531661278568:43110:6:3:140531678129184 | test | t11 | c4 | RECORD | X | GRANTED | 2, 2 | | 55 | 20 | 140531661278568:43110:4:3:140531678129528 | test | t11 | PRIMARY | RECORD | X,REC_NOT_GAP | GRANTED | 2 | | 55 | 20 | 140531661278568:43110:6:4:140531678129872 | test | t11 | c4 | RECORD | X,GAP | GRANTED | 3, 3 | +-----------+----------+-------------------------------------------+---------------+-------------+------------+-----------+------------------------+-------------+-----------+ 6 rows in set (0.00 sec) greatsql> select REQUESTING_THREAD_ID,REQUESTING_EVENT_ID,REQUESTING_ENGINE_LOCK_ID,BLOCKING_THREAD_ID,BLOCKING_EVENT_ID,BLOCKING_ENGINE_LOCK_ID from performance_schema.data_lock_waits; +----------------------+---------------------+-------------------------------------------+--------------------+-------------------+-------------------------------------------+ | REQUESTING_THREAD_ID | REQUESTING_EVENT_ID | REQUESTING_ENGINE_LOCK_ID | BLOCKING_THREAD_ID | BLOCKING_EVENT_ID | BLOCKING_ENGINE_LOCK_ID | +----------------------+---------------------+-------------------------------------------+--------------------+-------------------+-------------------------------------------+ | 56 | 14 | 140531661279416:43110:6:4:140531678132256 | 55 | 20 | 140531661278568:43110:6:4:140531678129872 | +----------------------+---------------------+-------------------------------------------+--------------------+-------------------+-------------------------------------------+ 1 row in set (0.00 sec)
通过上面2张表,可以看到 X,GAP锁 阻塞了 X,GAP,INSERT_INTENTION 锁;
2.5 结论
此次insert慢的原因就是update语句所在的事务执行时间较长,update语句产生了GAP锁;
insert 语句在执行时此update语句所在事务还没有执行完成,因此insert处于锁等待阶段,待update所在事务提交后insert才提交;
总结
导致此次问题的原因是 GAP锁阻塞了 INSERT_INTENTION 锁;因此建议客户在执行update操作时,where条件用主键列,这样可以避免加GAP锁。
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
将 Cohere 与 Elasticsearch 结合使用
本教程中的说明向你展示了如何使用推理 API 使用 Cohere 计算嵌入并将其存储起来,以便在 Elasticsearch 中进行高效的向量或混合搜索。本教程将使用 Python Elasticsearch 客户端执行操作。 你将学习如何: 使用 Cohere 服务为文本嵌入创建推理端点, 为 Elasticsearch 索引创建必要的索引映射, 构建推理管道以将文档与嵌入一起提取到索引中, 对数据执行混合搜索, 使用 Cohere 的重新排名模型对搜索结果进行重新排名, 使用 Cohere 的 ChatAPI 设计 RAG 系统。 本教程使用 SciFact 数据集。 请参阅 Cohere 的教程,了解使用不同数据集的示例。 要求 一个 Cohere 帐户。你可以在地址申请一个 API key 一个本地安装的集群。安装指令如下 Python 3.7 或更高版本 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装: 如何在 Linux,MacOS 及 Windows 上进行安装 Ela...
- 下一篇
拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式
自2023年后,人工智能技术进入了一个更为成熟和广泛应用的阶段,人工通用智能(AGI)这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景,从架构设计到落地实践,详细介绍拓数派云原生数据计算系统 PieDataCS。 1 中国 AGI 发展现状与趋势 1.1 AGI 市场与技术发展趋势 2023年被称为是 AGI 元年,大模型在人工智能领域掀起了一场风暴。尽管⼤模型在模仿⼈类认知⽅⾯取得了显著进步,但距离真正的通⽤智能还有很长的一段路。由于底层模型和算力离企业市场较远,我们相信 AGI 的发展将由应用占主导。 中国 AGI 市场将长期保持快速增长态势(InfoQ 研究中心) 而 AI Agent 可以简化用户与大模型的互动,允许用户只需指定目标,即可驱动大模型完成任务。由于 AI Agent 实现应用的优势主要集中于高度的环境适应性,企业环境的特定场景为 AI Agent 提供了理想的应用背景,垂直行业成为 AI Agent 最先实现应用的领域。 1.2 国内 AGI 市场分层 中国 AGI 市场技术框架自下向上可分为基础设施层、模型层、中间层和应用层四层: ➢ 基础...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题