久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL數(shù)據(jù)庫(kù)鎖定機(jī)制是什么

共計(jì) 2918 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。

本篇文章給大家分享的是有關(guān) MySQL 數(shù)據(jù)庫(kù)鎖定機(jī)制是什么,丸趣 TV 小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著丸趣 TV 小編一起來(lái)看看吧。

1. MySQL 鎖定機(jī)制簡(jiǎn)介

各存儲(chǔ)引擎使用三種類(lèi)型鎖定機(jī)制

行級(jí)鎖定(row-level)

表級(jí)鎖定(table-level)

頁(yè)級(jí)鎖定(page-leve):頁(yè)級(jí)鎖定介于行級(jí)鎖定與表級(jí)鎖定之間。

2. MySQL 數(shù)據(jù)庫(kù)中  

表級(jí)鎖定主要是 MyISAM、Memory、CSV 等一些非事務(wù)性存儲(chǔ)引擎,使用行級(jí)鎖定主要是 InnoDB 存儲(chǔ)引擎和 NDB Cluster 存儲(chǔ)引擎,頁(yè)級(jí)鎖定主要是 BerkeleyDB 存儲(chǔ)引擎

3. MyISAM 表級(jí)鎖定主要分為兩種類(lèi)型

讀鎖定,一個(gè)新客戶(hù)端在申請(qǐng)獲取讀鎖定資源的時(shí)候,需要滿(mǎn)足兩個(gè)條件:

請(qǐng)求鎖定的資源當(dāng)前沒(méi)有被寫(xiě)鎖定

寫(xiě)鎖定等待隊(duì)列(Pending write-lock queue)中沒(méi)有更高優(yōu)先級(jí)的寫(xiě)鎖定在等待

(只影響寫(xiě)操作)

寫(xiě)鎖定

(影響讀操作,同時(shí)也影響寫(xiě)操作)

4.  MySQL 中主要分 4 中隊(duì)列來(lái)維護(hù)這兩種鎖定:

兩個(gè)存放當(dāng)前正在鎖定的讀和寫(xiě)鎖定信息,另外兩個(gè)存放等待中的讀寫(xiě)鎖定西信息,如下:

Current read-lock queue (lock- read)

Pending read-lock queue (lock- read_wait)

Current write-lock queue (lock- write)

Pending write-lock queue (lock- write_wait)

5. InnoDB 的行級(jí)鎖定分為四種類(lèi)型

共享鎖(有叫做:讀鎖)

允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)的排它鎖。

排他鎖(有叫做:寫(xiě)鎖)

允許獲得排它鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)

意向共享鎖

意向排他鎖

6.  InnoDB 間隙鎖

InnoDB 的鎖定是通過(guò)在指向數(shù)據(jù)記錄的 *** 個(gè)索引鍵之前和 *** 一個(gè)索引鍵之后的空域空間標(biāo)記鎖定信息實(shí)現(xiàn)的。這種鎖定方式被稱(chēng)為 NEXT-KEY locking(間隙鎖)

間隙鎖弱點(diǎn):鎖定一個(gè)范圍之后,即使某些不存在的鍵值也會(huì)被無(wú)辜鎖定,造成鎖定的時(shí)候無(wú)法插入鍵值鎖定內(nèi)的任何數(shù)據(jù)。

通過(guò)索引實(shí)現(xiàn)鎖定的方式存在其他幾個(gè)較大的性能隱患:

鴻蒙官方戰(zhàn)略合作共建——HarmonyOS 技術(shù)社區(qū)

當(dāng) Query 無(wú)法利用索引的時(shí)候,InnoDB 會(huì)放棄使用 行級(jí)鎖定 而改用 表級(jí)鎖定,造成并發(fā)性能降低;

當(dāng) Query 使用的索引并不包含所有過(guò)濾條件時(shí),數(shù)據(jù)檢索使用到的索引鍵中的數(shù)據(jù)可能有部分不屬于 Query 的結(jié)果集行列,但是也會(huì)被鎖定,因?yàn)殚g隙鎖鎖定的是一個(gè)范圍,而不是具體的索引鍵。

當(dāng) Query 在使用索引定位數(shù)據(jù)的時(shí)候,如果使用的索引鍵一樣但訪問(wèn)的數(shù)據(jù)行不同(索引只是過(guò)濾條件的一部分),他們一樣會(huì)被鎖定。

7. MyISAM 表鎖優(yōu)化建議

縮短鎖定時(shí)間

盡量減少大的復(fù)雜 Query,將復(fù)雜 Query 拆分成幾個(gè)小的 Query 執(zhí)行。

盡可能地建立足夠高效的索引,讓數(shù)據(jù)檢索更迅速。

盡量讓 MyISAM 存儲(chǔ)引擎的表只存放必要的信息,控制字段類(lèi)型。

利用合適的機(jī)會(huì)優(yōu)化 MyISAM 表數(shù)據(jù)文件。

分離能并行的操作

concurrent_insert = 2,無(wú)論 MyISAM 存儲(chǔ)引擎的表數(shù)據(jù)文件的中間部分是否存在因?yàn)閯h除數(shù)據(jù)而留下的空閑空間,都允許在數(shù)據(jù)文件尾部進(jìn)行 Concurrent Insert。

concurrent_insert = 1,MyISAM 存儲(chǔ)引擎表數(shù)據(jù)文件中間不存在空閑空間的時(shí)候,可以從文件尾部進(jìn)行 Concurrent Insert。

concurrent_insert = 0,無(wú)論 MyISAM 存儲(chǔ)引擎的表數(shù)據(jù)文件的中間部分是否存在因?yàn)閯h除數(shù)據(jù)而留下的空閑空間,都不允許 Concurrent Insert。(讀鎖時(shí),不允許插入)

MyISAM 并非只能完全的串行化,MyISAM 存儲(chǔ)引擎還有一個(gè)特性 Concurrent Insert(并發(fā)插入)的特性。

MyISAM 存儲(chǔ)引擎有一個(gè)控制是否打開(kāi) Concurrent insert 功能的參數(shù)選項(xiàng):concurrent_insert 可以設(shè)置為 0/1/2:具體如下:

合理利用讀寫(xiě)優(yōu)先級(jí)

表級(jí)鎖定 默認(rèn)情況下寫(xiě)優(yōu)先級(jí)大于讀,如果讀操作多的時(shí)候,可以設(shè)置讀優(yōu)先級(jí)高,可設(shè)置參數(shù) low_priority_updates = 1。

8.  InnoDB 行鎖優(yōu)化建議

盡可能讓所有的數(shù)據(jù)檢索都通過(guò)索引來(lái)完成,從而避免 InnoDB 因?yàn)闊o(wú)法通過(guò)索引鍵加鎖而升級(jí)為表級(jí)鎖定

合理設(shè)計(jì)索引,讓 InnoDB 在索引鍵上加鎖的時(shí)候盡可能準(zhǔn)確,盡可能地縮小鎖定范圍,避免造成不必要的鎖定而影響其他 Query 的執(zhí)行。

盡可能減少基于范圍的數(shù)據(jù)檢索過(guò)濾條件,避免因間隙鎖帶來(lái)的負(fù)面影響而鎖定了不該鎖定的記錄。

盡量控制事務(wù)大小,減少鎖定的資源量和鎖定的時(shí)間長(zhǎng)度。

在業(yè)務(wù)環(huán)境允許的情況下,盡量使用較低級(jí)別的事務(wù)隔離,減少 MySQL 因?yàn)閷?shí)現(xiàn)事務(wù)隔離級(jí)別所帶來(lái)的附加成本。

9.   系統(tǒng)鎖定爭(zhēng)用情況查詢(xún)

MySQL 內(nèi)部有兩組專(zhuān)用的狀態(tài)變量記錄系統(tǒng)內(nèi)部資源爭(zhēng)用情況。

  表級(jí)鎖定的爭(zhēng)用狀態(tài)變量

mysql show status like table%

Table_locks_immediate:產(chǎn)生表級(jí)鎖定的次數(shù);

Table_locks_waited:出現(xiàn)表級(jí)鎖定爭(zhēng)用而發(fā)生等待的次數(shù)

           Table_locks_immediate 值大于 Table_locks_waited 5000 是比較合適的,在大就需要分析問(wèn)題所在。

            兩個(gè)狀態(tài)值都是從系統(tǒng)啟動(dòng)后開(kāi)始記錄,每出現(xiàn)一次加 1,如果這里 Table_locks_waited 狀態(tài)值比較高,說(shuō)明表級(jí)鎖定爭(zhēng)用嚴(yán)重,需進(jìn)一步分析。

InnoDB 行級(jí)鎖定狀態(tài)變量記錄

sql show status like innodb_row_lock%

Innodb_row_lock_current_waites:當(dāng)前正在等待鎖定的數(shù)量;

Innodb_row_lock_time:從系統(tǒng)啟動(dòng)到現(xiàn)在鎖定總時(shí)間長(zhǎng)度;

Innodb_row_lock_time_avg:每次等待所花平均時(shí)間;

Innodb_row_lock_time_max:從系統(tǒng)啟動(dòng)到現(xiàn)在等待最長(zhǎng)的一次所花的時(shí)間;

Innodb_row_lock_waits:從系統(tǒng)啟動(dòng)到現(xiàn)在總等待次數(shù)。

          5 個(gè)狀態(tài),比較重要的是 Innodb_row_lock_time_avg(等待平均時(shí)長(zhǎng)),Innodb_row_lock_waits(等待總次數(shù))及 Innodb_row_lock_time(等待總時(shí)長(zhǎng))

10.  InnoDB 

除了提供以上 5 個(gè)系統(tǒng)狀態(tài)變量外,還提供了更為豐富的即時(shí)狀態(tài)信息,實(shí)現(xiàn)方法如下:

創(chuàng)建 InnoDB Monitor 表來(lái)打開(kāi) InnoDB 的 monitor 功能

mysql create table innodb_monitor(a int) engine=innodb;

然后執(zhí)行”show innodb status 查看詳細(xì)信息

    為什么創(chuàng)建 innodb_monitor 表?

以上就是 MySQL 數(shù)據(jù)庫(kù)鎖定機(jī)制是什么,丸趣 TV 小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-03發(fā)表,共計(jì)2918字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 晋中市| 万山特区| 闵行区| 恭城| 铁岭县| 泰宁县| 景德镇市| 余姚市| 高淳县| 彭山县| 祁东县| 横山县| 庆元县| 静乐县| 政和县| 隆子县| 阿拉善右旗| 吉安市| 镇康县| 哈巴河县| 赣州市| 龙里县| 阿拉善右旗| 丰都县| 区。| 兴义市| 长葛市| 嘉鱼县| 建德市| 灌南县| 和静县| 阳东县| 阜新| 富源县| 会东县| 芜湖市| 双城市| 宜春市| 昌都县| 汤阴县| 凤阳县|