MySQL 原理與優(yōu)化之Update 優(yōu)化
前言:
談到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;
開(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)文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)庫(kù)查詢(xún)性能優(yōu)化的4個(gè)技巧干貨
- MySQL查詢(xún)性能優(yōu)化七種方式索引潛水
- MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案
- MySQL JOIN關(guān)聯(lián)查詢(xún)的原理及優(yōu)化
- MySQL查詢(xún)緩存優(yōu)化示例詳析
- MySQL關(guān)聯(lián)查詢(xún)優(yōu)化實(shí)現(xiàn)方法詳解
- 5招帶你輕松優(yōu)化MySQL count(*)查詢(xún)性能
- MySQL千萬(wàn)級(jí)數(shù)據(jù)的大表優(yōu)化解決方案
- mysql優(yōu)化之慢查詢(xún)分析+explain命令分析+優(yōu)化技巧總結(jié)
- MySQL數(shù)據(jù)庫(kù)的索引原理與慢SQL優(yōu)化的5大原則
相關(guān)文章
解決遠(yuǎn)程連接mysql很慢的方法(mysql_connect 打開(kāi)連接慢)
有次同事提出開(kāi)發(fā)使用的mysql數(shù)據(jù)庫(kù)連接很慢,因?yàn)槲覀兊膍ysql開(kāi)發(fā)數(shù)據(jù)庫(kù)是單獨(dú)一臺(tái)機(jī)器部署的,所以認(rèn)為可能是網(wǎng)絡(luò)連接問(wèn)題導(dǎo)致的。2011-07-07MySQL數(shù)據(jù)庫(kù)的觸發(fā)器和事務(wù)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的觸發(fā)器和事務(wù),觸發(fā)器是SQL?server提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過(guò)程,是由事件來(lái)觸發(fā)2022-08-08MySQL聯(lián)表查詢(xún)基本操作之left-join常見(jiàn)的坑
這篇文章主要給大家介紹了關(guān)于MySQL聯(lián)表查詢(xún)基本操作之left-join的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05MySQL SQL優(yōu)化教程之in和range查詢(xún)
這篇文章主要給大家介紹了關(guān)于MySQL SQL優(yōu)化教程之in和range查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12MySQL如何處理InnoDB并發(fā)事務(wù)中的間隙鎖死鎖
這篇文章主要為大家介紹了MySQL如何處理InnoDB并發(fā)事務(wù)中的間隙鎖死鎖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10mysql 5.7.17 安裝教程 附MySQL服務(wù)無(wú)法啟動(dòng)的解決方法
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17安裝教程,并且為大家分享了MySQL服務(wù)無(wú)法啟動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03mysql SELECT語(yǔ)句去除某個(gè)字段的重復(fù)信息
mysql SELECT語(yǔ)句去除某個(gè)字段的重復(fù)信息,需要的朋友可以收藏下。2010-04-04MySQL root賬號(hào)遠(yuǎn)程新建數(shù)據(jù)庫(kù)報(bào)錯(cuò)1044問(wèn)題及解決方法
這篇文章主要介紹了MySQL root賬號(hào)遠(yuǎn)程新建數(shù)據(jù)庫(kù)報(bào)錯(cuò)1044問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09