在一起查询时,MyISAM和InnoDB表锁定问题

时间:2013-07-22 22:37:15

标签: mysql locking innodb myisam

我正在努力修复乱糟糟的数据库。我在这个DB中有几个MyISAM和InnoDB表。我需要编写一个使用以下3个表的查询:

table_a => InnoDB
table_b => InnoDB
table_c => MyISAM

查询大约需要一分钟才能运行,如果在我的查询中发生表级锁定,我担心这会在我们的生产站点上创建的问题。我不确定它是否会基于文档。我知道MyISAM锁定表和InnoDB锁定行,但我一起使用它们。这是查询:

INSERT INTO 
    table_a (`x`, `y`, `z`)
SELECT 
    table_b.x, table_b.y, table_c.z 
FROM 
    table_b, table_c 
WHERE 
    table_b.id = table_c.id AND
    table_b.value IS NOT NULL AND
    table_b.id NOT IN (SELECT table_a.id FROM table_a WHERE 1);

我不确定执行此查询时会发生什么。我认为表锁定不会发生,因为写入发生在table_a上,即InnoDB。但是我不确定如何管理它,因为该写操作基于MyISAM和InnoDB上发生的读取。我还不是很了解如何管理锁定,我需要找出这些表在执行此查询时是否会锁定。感谢任何有帮助的人。

1 个答案:

答案 0 :(得分:1)

在查询过程中,整个table_c(MyISAM)将被锁定在“读取模式”。这意味着可以在此表上进行并发读取,但将保留并发写入。

如果单个写入被置于保持状态,则所有后续读取也将被置于保持状态(除非它们在HIGH_PRIORITY中发布)。

其他两个InnoDB表将表现出非常相似的行为,但可能不会出现在完整的表中。如果可以使用合适的索引来遵守匹配子句和JOIN条件,则只会锁定“某些”行(如果需要进行表扫描,仍然可能会锁定整个表 - 如果没有合适的索引可以使用,即)。