阿里EDAS “小表廣播”不能用的另一種實現總結


問題需求:

有兩張表,一張是分庫表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 語句: 這下就快多了 ,如果被修改的字段建立了索引,那就快的不行不行的了

 

 

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM