mysql優化 update中的in子句

2022-06-05 19:36:06 字數 1172 閱讀 2325

需求:mysql資料庫中,更新所有message_repo表中所有state='100' and receiver_id = '1'的資料為state='100',表中id為主鍵,state和receiver_id都有索引。

原語句:

update message_repo set state =

'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);

然後發現,workbench提示處於安全模式,即safe mode下只能採用主鍵更新。

我的id不就是主鍵?難道這個還不是主鍵更新,意識到這個sql肯定被mysql錯誤理解了,用執行分析果然發現問題。。。

update的where子句沒有使用主鍵索引,而是進行了全表掃瞄。

原本sql要表達的意思是:用select子句查詢所有符合條件的主鍵,然後update通過主鍵進行更新,但是實際上,mysql是全表逐行與select子句對比,沒有比這個更傻的操作了,要是表中資料多一點,死鎖是必定的。

更別說:這語句需要關閉safe mode。

優化後語句:

update message_repo a join (select id from message_repo where state =

'100

'and receiver_id ='1

') b on a.id=

b.id

set state =

'101

' , update_time = now() , read_time = now();

通過join子句,明確告訴mysql,我要先用主鍵進行篩選。

執行計畫

這下就正常,從執行計畫上看,所有條件都符合預期。

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欄位為 ...