我正在努力修复乱糟糟的数据库。我在这个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上发生的读取。我还不是很了解如何管理锁定,我需要找出这些表在执行此查询时是否会锁定。感谢任何有帮助的人。
答案 0 :(得分:1)
在查询过程中,整个table_c
(MyISAM)将被锁定在“读取模式”。这意味着可以在此表上进行并发读取,但将保留并发写入。
如果单个写入被置于保持状态,则所有后续读取也将被置于保持状态(除非它们在HIGH_PRIORITY
中发布)。
其他两个InnoDB表将表现出非常相似的行为,但可能不会出现在完整的表中。如果可以使用合适的索引来遵守匹配子句和JOIN
条件,则只会锁定“某些”行(如果需要进行表扫描,仍然可能会锁定整个表 - 如果没有合适的索引可以使用,即)。