0

我正在修复一个混乱的数据库。我在这个数据库中有几个 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);

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

4

1 回答 1

1

table_c在您的查询过程中,整个(MyISAM)将被锁定在“阅读模式”。这意味着该表上的并发读取是可能的,但并发写入将被保留。

如果单个写入被搁置,那么所有后续读取也将被搁置(除非它们在 中发出HIGH_PRIORITY)。

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

于 2013-07-22T22:56:15.937 回答