Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GreatSQL 中 Insert 慢是什么情况?

GreatSQL 中 Insert 慢是什么情况?

作者头像
GreatSQL社区
发布于 2024-07-06 00:17:48
发布于 2024-07-06 00:17:48
1270
举报

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 背景概述 客户反映,业务上某张表的 insert 操作速度很慢,单条 insert 语句的最大执行时间超过了 5 秒。在收到客户问题后,我们仔细检查了数据库状态以及主机的负载情况,发现目前一切正常,并没有发现数据库故障或主机负载过高导致 insert 操作变慢的问题。 因此,我们分析了慢日志,希望从中找出问题。经过分析,发现这条插入语句的query_timelock_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事务2T1BEGIN;BEGIN;T2update t10 set c2=20 where c4=2; T3 insert into t10 values (6,2,2,2,2);T4 -- hang住,处于锁等待T5commit;-- 锁等待结束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 锁。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GreatSQL社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十步零基础JavaScript学习路径
之前写过一篇26天学通前端开发,内容主要讲的就是前端学习路径,今天再来写一篇零基础的JavaScript学习路径,希望能帮编程零基础的前端爱好者指明方向。 开发环境和JavaScript版本问题 一、开发环境和JavaScript版本问题 开发环境越简单越好,一定不要在这个环节浪费时间。 首先说编辑器的选择,sublime text、vs code、atom、webstorm,还有HBuilder。新手入门的时候总想找一个最好的编辑器,其实这编辑器就和游戏里面选英雄一样,没有最厉害的,只有最适合你的,如果还
企鹅号小编
2018/01/30
9810
知乎精选—非科班出身,如何成为程序员?
知乎用户-胡朋 大学学的地理,现在在一家地图导航公司做后台开发(曾经想成为一个前端开发 者),我想说的是,是否科班出生并没那么重要。如果只是想糊口,学一两们语言就足够了,但是想成为一名出色的开发者,有太多需要学的东西了,对非科班出生 的来说,其中最大的不足就是知识结构的不完整,需要一点一点去积累。 我不太会码字,写点我自己的心得。大学从没想过自己会做开发,到毕业那会(2012年)找了好多单位都没人要,恰逢那段时间HTML5被炒的很热, 就想学点这个先找到一个容身之处。把自己关在宿舍两个月,一天看十几个小时的
wangxl
2018/03/08
1.6K0
如何成为一个上流的程序员
除去极少数天赋异禀的神级程序员,我们大部分人都是凡人。 凡人要从一个小菜鸟成长为全栈工程师大神,只能从少到多,慢慢积累知识。这里我推荐采用“先精后广,一专多长”的流程来学习。 先精后广,一转多长 毕业生遇到的第一个问题就是如何在一个城市,甚至是北上广深这样的大城市生存下来。生存下来需要一个稳定的工作,所以需要投一些简历给大公司或者小公司。 平心而论,程序员在市场上的供求关系比绝大部分职业都更有利于求职者,在微博上、twitter上、v2ex上……对优秀程序员的需求从来就没有减少过。优秀的程序员总是能找到工作
程序员互动联盟
2018/03/12
8280
从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(一)
图片来自网络 本人从事JavaWeb开发,应别人要求,思考再三,终决定专门开一贴来总结一下我个人目前推荐的学习路线。从啥也不会到能够从事JavaWeb开发,究竟要学习哪些东西?很多人都会迷茫这个地方。所以我打算随便谈谈我的看法。 我之前一直不想写,因为我知道一旦写了就要承担压力。必然会有一大波人来指责我,说什么什么你这样讲是毒鸡汤,怎能不管算法,不管计算机原理!你这样是误导新人!然后举出一大堆例子,说基础怎么怎么重要,你这样速成将来会有大问题!你这是在瞎扯,一看就知道你不懂得Java的精髓! 我大概能预见
剽悍一小兔
2018/05/17
8990
前端菜鸟是这样入门学习的,点进来!
现在从事IT方向的人有很多。由于Web前端薪资水平高,职业前景广阔,岗位缺口大,就业口径宽,想通过学习Web前端开发从而进入到该行业工作的人越来越多。当然也有很多人在犹豫不知道web前端开发都学哪些内容?零基础的可以学会吗?好不好学.
一墨编程学习
2018/09/14
7270
腾讯 IMWeb 前端团队大招聘,实习应届社招全都要
听说你, 想加入一个专业的前端团队? 想体验一个超大前端团队的团队氛围和前端技术氛围? 想学习一家大公司的开发流程和系统? 想观摩前端技术大牛? 这里统统都有!!! 社招和子公司岗位要求如下,子公司整体会比正式要求低一些。 岗位要求 能够熟练运用 HTML5、CSS3、ES6 构建高性能的 Web 应用程序 熟练使用至少一款主流的 JS 框架(React、Vue、Angular等) 掌握 Node 基础,有开发 Node 服务器的实践经验 熟悉 Web 开发调试技巧,能够熟练运用调试工具,有
用户1097444
2022/06/29
5300
腾讯 IMWeb 前端团队大招聘,实习应届社招全都要
Web前端和Web后端的区分「建议收藏」
一、绪论 1、 前台:呈现给用户的视觉和基本的操作。 后台:用户浏览网页时,我们看不见的后台数据跑动。后台包括前端、后端。 前端:对应我们写的html、css、javascript 等网页语言作用在前端网页。 后端:对应jsp、javaBean、dao层、action层和service层的业务逻辑代码。(包括数据库) 为什么jsp是后端呢?主要是jsp的运行原理是在tomcat服务器运行的。
全栈程序员站长
2022/08/02
1.8K0
为什么前端工程师薪资越来越高?
外媒网站Randstad US收集了目前IT领域各行业的数据,分析了劳动力趋势等数据,预测出在2018年,前端开发是三大最具有就业前景职业之一,而前端开发行业的薪资也会越来越高。
前朝楚水
2018/07/26
5940
为什么前端工程师薪资越来越高?
10年IT编程经验的老司机,和你唠唠前端的发展
本人在IT行业开发了近10年,去过腾讯,创过业,当初的“骗子马云”也成为了中国首富,在中关村“摆摊的刘强东”也娶了奶茶妹妹......而我,┭┮﹏┭┮,还在苦X的做开发,哎,就像伟大的哲学家“谁都不服
程序工场
2018/07/03
9090
聊聊编程语言的选择
大家好,我是鱼皮,今天聊聊编程语言的选择问题,通过对 10+ 主流编程语言的特点、优劣、应用场景、发展前景等简单分析,希望帮还在迷茫的小伙伴们选择最适合自己的语言去学习。
程序员鱼皮
2021/08/23
1.4K0
聊聊编程语言的选择
web前端程序员需要会那些技能?
  黑马程序员为大家分享web前端学习6大技术知识点,希望可以在今后的学习中帮到找到重点,以及学习的主次之分。
用户4104697
2018/12/04
9390
web前端程序员需要会那些技能?
漫谈前端之路
前言 前端之路何其漫漫~ 说明:本篇文章原是写给学弟学妹的,但想来花的功夫确实不少,就把此篇文章当做自己的一个阶段性总结文章了,会保持长期更新。 HTML 总的来说HTML并不难,甚至可以说很无脑……HTML的标签个人觉得过一遍就得,知道什么时候该用什么标签就可以了,因为在以后的开发中打交道最多的就是各种各样的标签,想不熟都难。就像现在我写这篇文章用的Markdown一样,只是几个标签的反复应用。那么html的学习就相对来说很自由了,可以跟着w3schoolW3school网址过一遍标签,网
用户1667431
2018/04/18
1.2K0
测试能力培养之前端调试能力
在现在这个H5流行的时代,作为测试人员不能仅仅依赖UI的反馈来确定问题,掌握前端调试的方法是分层测试技术中的最前端。理解、分析、定位前端工作原理,可以有效的提高测试效率并且准确提交缺陷报告。
TestOps
2022/04/07
5190
最流行的编程语言JavaScript能做什么?
首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言。 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担当不了这个大任。 开始之前,我先说一
Phodal
2018/01/29
2K0
Web前端开发初级阶段需要学习的知识有哪些?
今天来和大家讲讲Web前端开发需要学习什么?前端开发又需要用到哪些开发工具?下面济南IT培训优就业的老师就简单和大家介绍一下。 Web前端工程师其实在不同的公司,有不同的职能,但是称呼都是类似的。 1
企鹅号小编
2018/01/19
9750
Web前端开发初级阶段需要学习的知识有哪些?
关于成为一只体面的前端攻城狮
怎样算是个体面的前端攻城狮? 大概是,PM,设计,开发等工种都觉得你很专业,很腻害吧~ 下面阐述下我心中体面攻城狮该具备的 软件 能熟练使用前端会用的软件。软件主要分为以下几类 IDE 我用的是Su
前端GoGoGo
2018/08/27
5240
给前端新人看的前端之路漫谈
前言 前端之路何其漫漫~ 说明:本篇文章原是写给学弟学妹的,但想来花的功夫确实不少,就把此篇文章当做自己的一个阶段性总结文章了,会保持长期更新。 HTML 总的来说HTML并不难,甚至可以说很无脑……HTML的标签个人觉得过一遍就得,知道什么时候该用什么标签就可以了,因为在以后的开发中打交道最多的就是各种各样的标签,想不熟都难。就像现在我写这篇文章用的Markdown一样,只是几个标签的反复应用。那么html的学习就相对来说很自由了,可以跟着w3schoolW3school网址过一遍标签,网上也有很多其它网
用户1667431
2018/04/18
1.3K0
Node.js是什么?能做什么?终于有人讲明白了
在JavaScript语言努力摆脱“玩具语言”这个标签的进化历程中,Node.js绝对能记下浓墨重彩的一笔。Node.js并不是一个用于实现具体功能的第三方工具库,而是JavaScript程序的运行环境。
IT阅读排行榜
2023/02/13
17.1K0
Node.js是什么?能做什么?终于有人讲明白了
新时代程序员主流开发工具一览
俗话说的好:工欲善其事,必先利其器。一款好的开发工具对程序员来说是至关重要的,可以降低开发成本、提高开发的效率和代码质量。
程序员鱼皮
2021/07/22
1.6K0
学前端有什么好方法,怎么才能更快学会前端?
Web前端是网站的前台部分,运行在浏览器的PC端或移动端,为用户提供浏览网页。目前Web前端技术广泛应用于网站页面制作、微信、手机app开发、休闲游戏制作等场所。
用户7365393
2021/09/19
4330
推荐阅读
相关推荐
十步零基础JavaScript学习路径
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档