MySQL:将记录插入一个表中,从另一个表中读取而不锁定

时间:2011-02-21 13:41:38

标签: mysql performance locking

我正在努力做到这一点:

INSERT INTO stuff_to_archive
  SELECT a.id FROM stuff a INNER JOIN items b ON a.b_id = b.id AND (other conditions on b)

基本上,“东西”变得太大了,我想每晚归档旧记录。 Stuff_to_archive具有要归档的记录的ID,我稍后将其用作辅助以确保我创建和删除相同的记录。我试图这样做而不锁定“东西”或“项目”,所以我的网站的其余部分可以继续工作。

我正在加入项目,因为项目有关于我可以存档的“东西”记录的信息。现在,永远不会写入此查询匹配的所有记录(在两个表中)。两个表都有新记录一直添加,“items”记录已更新,但不是我匹配的记录(因为这些记录已经过时且不再被触及)

东西和物品是InnoDB。 Stuff_to_archive是MEMORY。

有没有办法运行该查询而不阻止对东西和项目的其他读/写? 我试过了

set SESSION transaction isolation level READ UNCOMMITTED;

但这似乎仍然阻止了一切。

此INSERT在stuff_to_archive表中创建约2百万条记录。

有没有办法在不阻止其他查询的情况下进行此INSERT?

谢谢!
丹尼尔

1 个答案:

答案 0 :(得分:0)

InnoDB锁定不是很好,但InnoDB中有隔离级别的全局设置和会话设置,您可以从MySQL终端检查它们:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

尝试设置全局事务级别:

SET GLOBAL transaction isolation level READ UNCOMMITTED;

您还可以尝试为所有新连接禁用autocommit,看看是否会产生影响

SET GLOBAL init_connect='SET autocommit=0';