SELECT
查询可以阻止INSERT
/ ALTER
查询吗?
我的从数据库中有以下内容(摘自ENGINE INNODB STATUS
):
---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
他们都用同一张桌子。SELECT
s是相同的查询,并且有几个连接到很少使用的表。INSERT
是一个没有联接的简单INSERT
。ALTER
是一个简单的ALTER TABLE REORGANIZE PARTITION
。
排名第一的(ALTER TABLE
)应该早在48小时前开始。INSERT
大约在ALTER
前两分钟。
我可以理解为什么INSERT
会阻塞ALTER
,但不明白为什么SELECT
会阻塞INSERT
。如果它真的运行了那么长时间,它就应该阻止以前的INSERTs
(我们平均每分钟有250次INSERT
)。
所以我只是想弄清楚到底发生了什么。
发布于 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
。请提供EXPLAIN
,SELECT
和SHOW CREATE TABLE
,如果您希望我们深入挖掘这一可能性。
https://dba.stackexchange.com/questions/108832
复制相似问题