使用子查询

时间:2015-07-14 08:50:43

标签: mysql sql performance locking

我有一个SP(Percona 5.6)正在使用3个子选择进行更新。每个子查询都使用不同的过滤器进行计数。所以基本上SP是

UPDATE table1
SET column1 = (SELECT count FROM table2 ...),
SET column2 = (SELECT count FROM table2 ...),
SET column3 = (SELECT count FROM table2 ...);

我在SP运行时检测到一些死锁,并且 table2 中的某些行会更新。

因此,我试图弄清楚如何在SP期间最小化 table2 的行锁定时间。如果我拉出子查询会发生什么,例如

SET @count1 = (SELECT count FROM table2 ...);
SET @count2 = (SELECT count FROM table2 ...);
SET @count3 = (SELECT count FROM table2 ...);

UPDATE table1
SET column1 = @count1,
SET column2 = @count2,
SET column3 = @count3;

我知道这会导致不一致,但在这种情况下,这是可以的。这会改变锁定时间吗?我不确定整个SP是否作为一个事务运行。这会改变性能吗?

1 个答案:

答案 0 :(得分:0)

在SP的持续时间内尝试SET tx_isolation = READ-UNCOMMITTED

SELECT count...真的是SELECT COUNT(*) ... WHERE ...并且会遇到很多行吗?或者只是撞到一排?

table1中只有一行吗?或者你没有留下WHERE条款?

(我担心你过度简化了这个问题;这可能导致得到无关的建议。)