欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL 原理與優(yōu)化之Update 優(yōu)化

 更新時(shí)間:2022年08月14日 10:58:10   作者:51CTO崔皓???????  
這篇文章主要介紹了MySQL 原理與優(yōu)化之Update 優(yōu)化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助

前言:

談到Update 語(yǔ)句大家可能不會(huì)陌生,很多情況下我們都會(huì)使用它來(lái)更新table中的記錄。一般而言我們會(huì)使用innodb 的存儲(chǔ)引擎,innodb引擎是基于行鎖的,具體一點(diǎn)說(shuō)是針對(duì)索引來(lái)加鎖的(保證鎖不能失效),并不是針對(duì)記錄加鎖,如果對(duì)于沒(méi)有建立索引的字段進(jìn)行過(guò)濾操作,從而執(zhí)行update 的話(huà),會(huì)導(dǎo)致表鎖 。

今天就看看在使用innodb的時(shí)候如何使用update 語(yǔ)句。

已經(jīng)存在course 表,其內(nèi)容如下:

目前該表沒(méi)有加任何的索引,默認(rèn)情況下id 是表的索引。

接著讓我們分別開(kāi)啟兩個(gè)事務(wù)(兩個(gè)客戶(hù)端),分別執(zhí)行下述指令。

開(kāi)啟第一個(gè)事務(wù):

begin;
update course set name = 'Java' where id = 1;

3

開(kāi)啟另外一個(gè)事務(wù)

begin;
update course set name = 'Spark' where id = 4;

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

兩個(gè)事務(wù)能夠并行執(zhí)行的條件是id 是表course 的索引,可以由于update id 分別對(duì)應(yīng)2 和4 ,只是針對(duì)這兩行記錄進(jìn)行加鎖。

接著讓我們看看另外一個(gè)例子,依舊是開(kāi)啟兩個(gè)事務(wù),但是where 條件選擇使用name ,而且name 沒(méi)有作為course 表的索引。

開(kāi)啟一個(gè)事務(wù):

begin;
update course set name = 'Vue.js' where name = 'PHP';

然后再執(zhí)行另外一個(gè)事務(wù)

begin;
update course set name = 'SQLServer' where name = 'MySQL';

此時(shí)在執(zhí)行第二個(gè)事務(wù)的update 語(yǔ)句的時(shí)候,會(huì)被阻塞。就是因?yàn)獒槍?duì)name 的過(guò)濾條件并不是course 的索引,此時(shí)的update 語(yǔ)句進(jìn)行了鎖表的操作,必須等第一個(gè)事務(wù)commit之后,釋放掉表鎖,第二個(gè)事務(wù)才能繼續(xù)執(zhí)行。

為了讓兩個(gè)事務(wù)能夠并行執(zhí)行,我們將name 加入到course 的索引中去。

create index index_name on course(name);
show index from course;

接著再執(zhí)行剛才的兩個(gè)事務(wù),這兩個(gè)事務(wù)分別對(duì)不同的記錄進(jìn)行更新,where 中的name條件不一樣的情況下,也不會(huì)出現(xiàn)鎖表的情況,這是因?yàn)閷ame 作為了course 的索引。

為了演示方便,這里我們將更新的條件調(diào)整一下:

開(kāi)啟一個(gè)事務(wù):

begin;
update course set name = 'PHP' where name = 'Vue.js';

然后再執(zhí)行另外一個(gè)事務(wù)

begin;
update course set name = 'MySQL' where name = 'SQLServer';

結(jié)果和我們預(yù)想的一樣,兩個(gè)事務(wù)可以并行執(zhí)行,同時(shí)在commit之后能夠看到結(jié)果。

總結(jié)一下, 如果使用innodb存儲(chǔ)引擎,update 的時(shí)候存在where 條件的情況下,條件字段是索引的情況可以提升更新的效率,避免鎖表的情況發(fā)生。

到此這篇關(guān)于MySQL 原理與優(yōu)化之Update 優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL Update 優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論