亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言:

談到Update 語句大家可能不會陌生,很多情況下我們都會使用它來更新table中的記錄。一般而言我們會使用innodb 的存儲引擎,innodb引擎是基于行鎖的,具體一點說是針對索引來加鎖的(保證鎖不能失效),并不是針對記錄加鎖,如果對于沒有建立索引的字段進行過濾操作,從而執(zhí)行update 的話,會導致表鎖 。

今天就看看在使用innodb的時候如何使用update 語句。

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

目前該表沒有加任何的索引,默認情況下id 是表的索引。

接著讓我們分別開啟兩個事務(兩個客戶端),分別執(zhí)行下述指令。

開啟第一個事務:

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

3

開啟另外一個事務

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

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

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

接著讓我們看看另外一個例子,依舊是開啟兩個事務,但是where 條件選擇使用name ,而且name 沒有作為course 表的索引。

開啟一個事務:

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

然后再執(zhí)行另外一個事務

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

此時在執(zhí)行第二個事務的update 語句的時候,會被阻塞。就是因為針對name 的過濾條件并不是course 的索引,此時的update 語句進行了鎖表的操作,必須等第一個事務commit之后,釋放掉表鎖,第二個事務才能繼續(xù)執(zhí)行。

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

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

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

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

開啟一個事務:

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

然后再執(zhí)行另外一個事務

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

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

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

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

相關文章

最新評論