mysql-update時where條件無索引鎖全表


                                             

                                                                                                                

 
 
1 5.3日數據處理需求

UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 YEAR) where warranty_end_date = '1900-01-01';

2 處理過程

2.1查看執行計划

很明顯走的是索引的全表掃描,再加上數據庫的隔離級別是RR的級別,並且warranty_end_date字段無索引,會造成全表的GAP鎖,為了減少更新階段對其它dml語句造成lock的風險,該數據庫版本是支持online DDL的,特在warranty_end_date字段上

創立一個索引

2.2創建索引

mysql> alter table md_meter add index idx_warranty_end_date;

執行計划可見語句執行效果明顯改善

 

2.3 執行更新

mysql> UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 YEAR) where warranty_end_date = '1900-01-01';

 

 

加鎖處理分析 online DDL可參考文檔:

http://blog.itpub.net/29096438/viewspace-1816596/

http://hedengcheng.com/?p=771

 


免責聲明!

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



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