問題需求:
有兩張表,一張是分庫表tableA ,另一張是非分庫表tableB,兩張表機構如下:
tableA的bus_col_a 本來應該關聯tableB的bus_col_b字段 現在關聯成了id字段,
需要修改tableA表的部分數據(50萬以下)的bus_col_a字段的值為tableB的bus_col_b字段的值,但是tableA表是分庫表,數據量很大(2K萬以上),tableB是非分庫表,需要對tableB進行“小表廣播”,可悲的是EDAS的小表廣播不可用!!!
有的人可能會說,不就是簡單的一句
UPDATE tablea a SET bus_col_a = (SELECT b.bus_col_b from tableb b where a.bus_col_a = b.id);
語句的事情那么簡單的事情嗎~ 呵呵 那您可以試試了 肯定是不行的,會慢的要命的,你根部不知道什么時候能update操作結束。
應為是分庫,那么你會想可以分庫操作啊,不好意思 tableB表只一個庫中有,別的庫中都沒有tableB表,所以你即使分庫操作成功了 也只是修改了其中一個庫的數據 別的庫的數據還是沒有修改的。

建表語句:
tableA: CREATE TABLE `tablea` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `bus_col_a` int(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; tableB: CREATE TABLE `tableb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `bus_col_b` int(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
解決思路:
考慮到需要修改的數據並不多,可以對每個需要修改的數據分庫執行一個update語句來修改數據 例如:
UPDATE tablea SET bus_col_a = '1' where bus_col_a='10001'
操作步驟:
1.將需要修改的數據提取出來:
INSERT INTO tablea_temp (id,user_id,bus_col_a) SELECT id,user_id,bus_col_a from tablea where+需要修改數據的條件
2.生成需要修改的sql語句:
SELECT CONCAT('/!TDDL:SCAN AND MERGE_CONCURRENT=TRUE*/update tablea set bus_col_a=',bus_col_b,' where bus_col_a=',bus_col_a,';') from ( SELECT DISTINCT a.bus_col_a,b.bus_col_b from tablea a LEFT JOIN tableb b on a.bus_col_a = b.id ) as aa
/!TDDL:SCAN AND MERGE_CONCURRENT=TRUE*/ 表示分庫執行后面的sql語句
3. 分庫執行生成的sql 語句: 這下就快多了 ,如果被修改的字段建立了索引,那就快的不行不行的了

