需求:mysql資料庫中,更新所有message_repo表中所有state='100' and receiver_id = '1'的資料為state='100',表中id為主鍵,state和receiver_id都有索引。
原語句:
update message_repo set state =然後發現,workbench提示處於安全模式,即safe mode下只能採用主鍵更新。'101
' , update_time = now() , read_time =
now()
where id in (select a.id from (select id from message_repo where state =
'100
'and receiver_id ='1
') a);
我的id不就是主鍵?難道這個還不是主鍵更新,意識到這個sql肯定被mysql錯誤理解了,用執行分析果然發現問題。。。
update的where子句沒有使用主鍵索引,而是進行了全表掃瞄。
原本sql要表達的意思是:用select子句查詢所有符合條件的主鍵,然後update通過主鍵進行更新,但是實際上,mysql是全表逐行與select子句對比,沒有比這個更傻的操作了,要是表中資料多一點,死鎖是必定的。
更別說:這語句需要關閉safe mode。
優化後語句:
update message_repo a join (select id from message_repo where state =通過join子句,明確告訴mysql,我要先用主鍵進行篩選。'100
'and receiver_id ='1
') b on a.id=
b.id
set state =
'101
' , update_time = now() , read_time = now();
執行計畫
這下就正常,從執行計畫上看,所有條件都符合預期。
mysql批量update資料優化
有一張表goods中有20w條資料,現在需要把某個欄位的值做md5加密後更新。一條一條迴圈更新效能差不說,還容易造成資料庫阻塞。set time limit 0 ini set memory limit 1g mysqli new mysqli 127.0.0.1 root root wx 3306...
Oracle中update執行效率的優化
工作中經常遇到update大表的時候執行效率很低,那麼怎樣才能讓oracle中update資料量比較大的表執行的更快呢?先看個簡單的例子吧 需求是我們要將表intf cms calluser tpye中的lant id更新成cms.serv base msg表中的latn id,關聯條件是intf ...
Oracle的update語句優化研究
最近研究sql優化,以下文章 網際網路 1.語法 單錶 update 表名稱 set 列名稱 新值 where 列名稱 某值 如 update t join situation set join state 1 whereyear 2011 更新年度為 2011 的資料的join state欄位為 ...