記mysql Insert into select語句問題


問題:

由於數據數據庫中 order_today 數據量過大,當時好像有 700W 了,並且每天在以 30W 的速度增加。

所以要 將 order_today 內的部分數據遷移到 order_record 中,並將 order_today 中的數據刪除,這樣來降低 order_today 表中的數據量。


錯誤操作:

在默認的事務隔離級別下:insert into order_record select * from order_today 加鎖規則是:order_record 表鎖,order_today 逐步鎖(掃描一個鎖一個)。
通過觀察遷移 SQL 的執行情況你會發現 order_today 是全表掃描,也就意味着在執行 insert into select from 語句時,MySQL 會從上到下掃描 order_today 內的記錄並且加鎖,這樣一來不就和直接鎖表是一樣了。

 

正確操作:

由於查詢條件會導致 order_today 全表掃描,什么能避免全表掃描呢,很簡單嘛,給 pay_success_time 字段添加一個 idx_pay_suc_time 索引就可以了。

 

總結:

使用 insert into tablA select * from tableB 語句時,一定要確保 tableB 后面的 where,order 或者其他條件,都需要有對應的索引,來避免出現 tableB 全部記錄被鎖定的情況。

 


免責聲明!

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



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