我正在运行以下(虚拟)查询
CREATE TABLE large_temp_table AS
SELECT a.*, b.*, c.*
FROM a
LEFT JOIN b ON a.foo = b.foo
LEFT JOIN c ON a.bar = c.bar
Run Code Online (Sandbox Code Playgroud)
假设查询运行需要 10 分钟。在运行时尝试更新表 a、b 或 c 中的值将等待上述查询首先完成。我想避免这个锁(不关心数据一致性)。我怎样才能做到这一点?
使用:MySQL 5.1.41 和 InnoDB 表
ps 设置事务隔离级别读取未提交;不会改变行为
更新 在执行查询时,显示 ENGINE INNODB STATUS 的输出如下(我特意在这里做了一个非常慢的查询)
=====================================
120323 15:26:29 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 8 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 1470, signal count 1468
Mutex spin waits 0, rounds 7525, …
Run Code Online (Sandbox Code Playgroud) 出于性能原因,我们正在对大量数据进行非规范化处理。基本上,通常将 JOIN 超过 10 个表的 Query 替换为没有 JOIN 的 Query,但所有必要的数据都存储/缓存在初始表中。
我是触发器的坚定拥护者,它可以帮助我保持所有数据的更新绝对透明。公司中还有其他决策者反对使用触发器(出于多种原因)并建议改为构建 VIEW,希望 VIEW 已经针对更好的数据检索进行了优化。
在 MySQL 中是这种情况吗?