首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL选择阻塞插入?

MySQL选择阻塞插入?
EN

Database Administration用户
提问于 2015-08-03 08:49:41
回答 1查看 3.8K关注 0票数 1

SELECT查询可以阻止INSERT / ALTER查询吗?

我的从数据库中有以下内容(摘自ENGINE INNODB STATUS):

代码语言:javascript
运行
复制
---TRANSACTION 26DA7060, not started
mysql tables in use 5, locked 12
MySQL thread id 516232, OS thread handle 0x7fcf8304a700, query id 350388626 event_scheduler Waiting for table metadata lock
ALTER TABLE xxxxxxxxxxxx REORGANIZE PARTITION . . . .

---TRANSACTION 26DA705F, ACTIVE 201692 sec
5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1
MySQL thread id 2, OS thread handle 0x7fc99aa91700, query id 350388642 Waiting for table metadata lock
INSERT INTO xxxxxxxxxxxx VALUES (. . . . . . . . . . . . .)

---TRANSACTION 2499F3C3, ACTIVE 1031443 sec fetching rows
mysql tables in use 11, locked 0
MySQL thread id 338078, OS thread handle 0x7fcf830dd700, query id 260018270 127.0.0.1 xxxxxxxxxxx Sending data
SELECT . . . .
Trx read view will not see trx with id >= 2499F3C4, sees < 2486B035

---TRANSACTION 2499EB0F, ACTIVE 1031500 sec fetching rows
mysql tables in use 11, locked 0
MySQL thread id 338037, OS thread handle 0x7fcf8307b700, query id 260008885 127.0.0.1 xxxxxxxxxxx Sending data
SELECT . . . .
Trx read view will not see trx with id >= 2499EB10, sees < 2486B035

---TRANSACTION 2486B035, ACTIVE 1091724 sec fetching rows
mysql tables in use 11, locked 0
MySQL thread id 330522, OS thread handle 0x7fcf8313f700, query id 255888600 127.0.0.1 xxxxxxxxxxx Sending data
SELECT . . . .
Tr  Trx read view will not see trx with id >= 2486B036, sees < 2486B036

他们都用同一张桌子。SELECTs是相同的查询,并且有几个连接到很少使用的表。INSERT是一个没有联接的简单INSERTALTER是一个简单的ALTER TABLE REORGANIZE PARTITION

排名第一的(ALTER TABLE)应该早在48小时前开始。INSERT大约在ALTER前两分钟。

我可以理解为什么INSERT会阻塞ALTER,但不明白为什么SELECT会阻塞INSERT。如果它真的运行了那么长时间,它就应该阻止以前的INSERTs (我们平均每分钟有250次INSERT )。

所以我只是想弄清楚到底发生了什么。

EN

回答 1

Database Administration用户

发布于 2015-08-03 19:32:49

输出仅显示事务中的当前查询。BEGIN...COMMIT中还有什么?还是你在运行autocommit=0?还是=1?

在事务期间,SELECT在它正在查看的行上获取共享锁。

INSERT抢占独家锁(S)。听起来SELECT已经有了INSERT想要的锁。

也许SELECT涉及到一个表格扫描?

还请注意,它写的是table metadata lock。这是比“排锁”更大的东西。

如果你有一个11表的JOIN,它需要12天,我怀疑你缺少一个指数。或者可能缺少一个ON子句,从而将INNER JOIN转换为非常昂贵的CROSS JOIN。请提供EXPLAINSELECTSHOW CREATE TABLE,如果您希望我们深入挖掘这一可能性。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/108832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档