SQL優化之多表關聯批量更新


1、背景

清洗表cookie_clean_t的數據分配清洗,清洗成功的結果記錄在成功表cookie_short_succ_t中,間隔10分鍾根據成功表cookie_short_succ_t的數據更新清洗表cookie_clean_t中數據狀態為成功。清洗表數據量50多萬條!

2、實現方案

2.1、版本V1

UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<![CDATA[ <= ]]>#{lastTime})
AND cct.ctime<![CDATA[ >= ]]>CURDATE()

在配置高的生產環境(8核16G內存4M帶寬)並未發現驗證問題,在測試環境(2核4G內存2M帶寬)影響到數據分發的SQL查詢語句吃CPU占到195%

2.2、版本V2

UPDATE cookie_clean_t cct
INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid 
SET cct.state=1
WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<![CDATA[ <= ]]>#{lastTime}

優化成表關聯批量更新后索引生效,CPU占用不足2%

分析SQL語句例子:

EXPLAIN
UPDATE cookie_clean_t cct SET cct.state=1 WHERE cct.state=0
AND cct.uuid IN(SELECT csst.uuid FROM cookie_short_succ_t csst WHERE csst.ctime<='2019-09-10 09:00:00')
AND cct.ctime>=CURDATE()

1 UPDATE cct index idx_state,idx_ctime PRIMARY 8 502077 100 Using where
2 DEPENDENT SUBQUERY csst ALL 1378 3.33 Using where

 

EXPLAIN
UPDATE cookie_clean_t cct
INNER JOIN cookie_short_succ_t csst ON cct.uuid=csst.uuid
SET cct.state=1
WHERE cct.state=0 AND cct.ctime>=CURDATE() AND csst.ctime<='2019-09-10 09:00:00';

1 SIMPLE csst ALL 284 33.33 Using where
1 UPDATE cct eq_ref PRIMARY,idx_state,idx_ctime,idx_uuid PRIMARY 8 db_wb3.csst.uuid 1 25 Using where

 

show full processlist;
kill id;

 


免責聲明!

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



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