我正在努力做到这一点:
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?
谢谢!
丹尼尔
答案 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';