Mysql
UPDATE 表 IF 數據在另一個
我想從另一個表中檢索一些數據並將其放入我的第一個表中。
我使用了這個查詢:
UPDATE table_1 SET table_1.firstname = ( SELECT firstname FROM table_2 WHERE table_2.lastname = table_1.lastname LIMIT 1 );
但是這個請求超時了,因為我有將近 300k 行
table_1
我嘗試只更新一條記錄中的一個欄位,如下所示:
UPDATE table_1 SET table_1.firstname = ( SELECT firstname FROM table_2 WHERE table_2.lastname = "toto" LIMIT 1 );
但我得到了:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我想知道我的請求是否可以更高效、更快?
Edit_1:我不能準確地放置表的結構,但我用我在查詢中使用的範例來表示它:
*************************** 1. row *************************** Table: table_1 Create Table: CREATE TABLE `table_1` ( `lastname` varchar(9) NOT NULL, `firstname` varchar(14) DEFAULT NULL, PRIMARY KEY (`lastname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) *************************** 1. row *************************** Table: table_2 Create Table: CREATE TABLE `table_2` ( `lastname` varchar(9) CHARACTER SET latin1 NOT NULL, `firstname` varchar(14) CHARACTER SET latin1 NOT NULL, PRIMARY KEY (`firstname`), KEY `lastname` (`lastname`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
我認為還有另一個問題,因為即使我沒有循環超過 300k 行,我也會超時。
這裡 table_1 中的記錄數:260905 和 table_2 中的記錄數:32,165124
因為您使用的是相關子查詢,正如 Akina 所提到的,它可能會導致對您的整個表(如果我沒看錯的話是 32,165,124 行)發生掃描操作。您最好以更相關的方式編寫查詢,這可以通過 來實現
INNER JOIN
,例如:UPDATE table_1 INNER JOIN table_2 ON table_1.lastname = table_2.lastname SET table_1.firstname = table_2.firstname
INNER JOIN
只會生成一個結果集,其中數據存在於兩個表中,用於子句中連接的欄位ON
。因此,只有存在於table_2
其中並與之匹配table_1
的lastname
行將用於UPDATE
並且可能會導致更有效的查找操作。