MySQL 原理與優(yōu)化之Update 優(yōu)化
前言:
談到Update 語句大家可能不會陌生,很多情況下我們都會使用它來更新table中的記錄。一般而言我們會使用innodb 的存儲引擎,innodb引擎是基于行鎖的,具體一點說是針對索引來加鎖的(保證鎖不能失效),并不是針對記錄加鎖,如果對于沒有建立索引的字段進行過濾操作,從而執(zhí)行update 的話,會導致表鎖 。
今天就看看在使用innodb的時候如何使用update 語句。
已經(jīng)存在course 表,其內(nèi)容如下:
目前該表沒有加任何的索引,默認情況下id 是表的索引。
接著讓我們分別開啟兩個事務(兩個客戶端),分別執(zhí)行下述指令。
開啟第一個事務:
begin; update course set name = 'Java' where id = 1;
開啟另外一個事務
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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)庫查詢性能優(yōu)化的4個技巧干貨
- MySQL查詢性能優(yōu)化七種方式索引潛水
- MySQL select count(*)計數(shù)很慢優(yōu)化方案
- MySQL JOIN關聯(lián)查詢的原理及優(yōu)化
- MySQL查詢緩存優(yōu)化示例詳析
- MySQL關聯(lián)查詢優(yōu)化實現(xiàn)方法詳解
- 5招帶你輕松優(yōu)化MySQL count(*)查詢性能
- MySQL千萬級數(shù)據(jù)的大表優(yōu)化解決方案
- mysql優(yōu)化之慢查詢分析+explain命令分析+優(yōu)化技巧總結
- MySQL數(shù)據(jù)庫的索引原理與慢SQL優(yōu)化的5大原則
相關文章
解決遠程連接mysql很慢的方法(mysql_connect 打開連接慢)
有次同事提出開發(fā)使用的mysql數(shù)據(jù)庫連接很慢,因為我們的mysql開發(fā)數(shù)據(jù)庫是單獨一臺機器部署的,所以認為可能是網(wǎng)絡連接問題導致的。2011-07-07MySQL聯(lián)表查詢基本操作之left-join常見的坑
這篇文章主要給大家介紹了關于MySQL聯(lián)表查詢基本操作之left-join的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-05-05MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖
這篇文章主要為大家介紹了MySQL如何處理InnoDB并發(fā)事務中的間隙鎖死鎖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10mysql 5.7.17 安裝教程 附MySQL服務無法啟動的解決方法
這篇文章主要為大家詳細介紹了mysql 5.7.17安裝教程,并且為大家分享了MySQL服務無法啟動的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03MySQL root賬號遠程新建數(shù)據(jù)庫報錯1044問題及解決方法
這篇文章主要介紹了MySQL root賬號遠程新建數(shù)據(jù)庫報錯1044問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09