MySQL 原理與優(yōu)化之Update 優(yōu)化
前言:
談到Update 語句大家可能不會陌生,很多情況下我們都會使用它來更新table中的記錄。一般而言我們會使用innodb 的存儲引擎,innodb引擎是基于行鎖的,具體一點說是針對索引來加鎖的(保證鎖不能失效),并不是針對記錄加鎖,如果對于沒有建立索引的字段進(jìn)行過濾操作,從而執(zhí)行update 的話,會導(dǎo)致表鎖 。
今天就看看在使用innodb的時候如何使用update 語句。
已經(jīng)存在course 表,其內(nèi)容如下:

目前該表沒有加任何的索引,默認(rèn)情況下id 是表的索引。
接著讓我們分別開啟兩個事務(wù)(兩個客戶端),分別執(zhí)行下述指令。
開啟第一個事務(wù):
begin; update course set name = 'Java' where id = 1;

開啟另外一個事務(wù)
begin; update course set name = 'Spark' where id = 4;

兩個事務(wù)都可以執(zhí)行,然后再分別執(zhí)行兩個事務(wù)的 commit 操作,就可以看到更新的結(jié)果。

兩個事務(wù)能夠并行執(zhí)行的條件是id 是表course 的索引,可以由于update id 分別對應(yīng)2 和4 ,只是針對這兩行記錄進(jìn)行加鎖。
接著讓我們看看另外一個例子,依舊是開啟兩個事務(wù),但是where 條件選擇使用name ,而且name 沒有作為course 表的索引。
開啟一個事務(wù):
begin; update course set name = 'Vue.js' where name = 'PHP';
然后再執(zhí)行另外一個事務(wù)
begin; update course set name = 'SQLServer' where name = 'MySQL';
此時在執(zhí)行第二個事務(wù)的update 語句的時候,會被阻塞。就是因為針對name 的過濾條件并不是course 的索引,此時的update 語句進(jìn)行了鎖表的操作,必須等第一個事務(wù)commit之后,釋放掉表鎖,第二個事務(wù)才能繼續(xù)執(zhí)行。

為了讓兩個事務(wù)能夠并行執(zhí)行,我們將name 加入到course 的索引中去。
create index index_name on course(name); show index from course;

接著再執(zhí)行剛才的兩個事務(wù),這兩個事務(wù)分別對不同的記錄進(jìn)行更新,where 中的name條件不一樣的情況下,也不會出現(xiàn)鎖表的情況,這是因為將name 作為了course 的索引。
為了演示方便,這里我們將更新的條件調(diào)整一下:
開啟一個事務(wù):
begin; update course set name = 'PHP' where name = 'Vue.js';
然后再執(zhí)行另外一個事務(wù)
begin; update course set name = 'MySQL' where name = 'SQLServer';
結(jié)果和我們預(yù)想的一樣,兩個事務(wù)可以并行執(zhí)行,同時在commit之后能夠看到結(jié)果。
總結(jié)一下, 如果使用innodb存儲引擎,update 的時候存在where 條件的情況下,條件字段是索引的情況可以提升更新的效率,避免鎖表的情況發(fā)生。
到此這篇關(guān)于MySQL 原理與優(yōu)化之Update 優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL Update 優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)庫查詢性能優(yōu)化的4個技巧干貨
- MySQL查詢性能優(yōu)化七種方式索引潛水
- MySQL select count(*)計數(shù)很慢優(yōu)化方案
- MySQL JOIN關(guān)聯(lián)查詢的原理及優(yōu)化
- MySQL查詢緩存優(yōu)化示例詳析
- MySQL關(guān)聯(lián)查詢優(yōu)化實現(xiàn)方法詳解
- 5招帶你輕松優(yōu)化MySQL count(*)查詢性能
- MySQL千萬級數(shù)據(jù)的大表優(yōu)化解決方案
- mysql優(yōu)化之慢查詢分析+explain命令分析+優(yōu)化技巧總結(jié)
- MySQL數(shù)據(jù)庫的索引原理與慢SQL優(yōu)化的5大原則
相關(guān)文章
解決遠(yuǎn)程連接mysql很慢的方法(mysql_connect 打開連接慢)
有次同事提出開發(fā)使用的mysql數(shù)據(jù)庫連接很慢,因為我們的mysql開發(fā)數(shù)據(jù)庫是單獨一臺機器部署的,所以認(rèn)為可能是網(wǎng)絡(luò)連接問題導(dǎo)致的。2011-07-07
MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù)
這篇文章主要介紹了MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù),觸發(fā)器是SQL?server提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲過程,是由事件來觸發(fā)2022-08-08
MySQL聯(lián)表查詢基本操作之left-join常見的坑
這篇文章主要給大家介紹了關(guān)于MySQL聯(lián)表查詢基本操作之left-join的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
MySQL如何處理InnoDB并發(fā)事務(wù)中的間隙鎖死鎖
這篇文章主要為大家介紹了MySQL如何處理InnoDB并發(fā)事務(wù)中的間隙鎖死鎖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
mysql 5.7.17 安裝教程 附MySQL服務(wù)無法啟動的解決方法
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17安裝教程,并且為大家分享了MySQL服務(wù)無法啟動的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
MySQL root賬號遠(yuǎn)程新建數(shù)據(jù)庫報錯1044問題及解決方法
這篇文章主要介紹了MySQL root賬號遠(yuǎn)程新建數(shù)據(jù)庫報錯1044問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

