【问题标题】:MySQL: Inserting records in one table reading from another, without lockingMySQL:在一个表中插入记录,从另一个表中读取,而不锁定
【发布时间】:2011-02-21 13:41:37
【问题描述】:

我基本上是在尝试这样做:

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,我稍后将其用作辅助以确保创建和删除相同的记录。我试图在不锁定“东西”或“项目”的情况下做到这一点,所以我的网站的其余部分可以继续工作。

我正在加入项目,因为项目包含有关我可以归档哪些“资料”记录的信息。现在,与此查询匹配的所有记录(在两个表中)都不会被写入。两个表都一直添加新记录,并且“项目”更新了记录,但没有我匹配的记录(因为这些记录很旧并且不再触及)

Stuff 和 Items 是 InnoDB。 Stuff_to_archive 是 MEMORY。

有什么方法可以运行该查询而不阻塞其他对东西和项目的读/写? 我试过了

set SESSION transaction isolation level READ UNCOMMITTED;

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

这个 INSERT 在 stuff_to_archive 表中创建了大约 200 万条记录。

有什么方法可以在不阻塞其他查询的情况下进行此 INSERT?

谢谢!
丹尼尔

【问题讨论】:

    标签: mysql performance locking


    【解决方案1】:

    我对 InnoDB 锁不是很好,但是 InnoDB 中有一个全局设置和一个会话设置用于隔离级别,你可以从 MySQL 终端检查它们:

    SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
    

    尝试设置全局事务级别也许:

    SET GLOBAL transaction isolation level READ UNCOMMITTED;
    

    您也可以尝试为所有新连接禁用autocommit,看看是否会有所不同

    SET GLOBAL init_connect='SET autocommit=0';
    

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2010-11-19
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多