www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

MySQL數(shù)據(jù)庫(kù)鎖定機(jī)制?這篇文章告訴你

2018-02-09 13:06:04 ITPUB  點(diǎn)擊量: 評(píng)論 (0)
1. MySQL 鎖定機(jī)制簡(jiǎn)介各存儲(chǔ)引擎使用三種類型鎖定機(jī)制行級(jí)鎖定(row-level)表級(jí)鎖定(table-level)頁(yè)級(jí)鎖定(page-leve) : 頁(yè)級(jí)鎖...

MySQL數(shù)據(jù)庫(kù)鎖定機(jī)制?這篇文章告訴你

1. MySQL 鎖定機(jī)制簡(jiǎn)介
各存儲(chǔ)引擎使用三種類型鎖定機(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í)鎖定主要分為兩種類型
讀鎖定,一個(gè)新客戶端在申請(qǐng)獲取讀鎖定資源的時(shí)候,需要滿足兩個(gè)條件:
請(qǐng)求鎖定的資源當(dāng)前沒有被寫鎖定
寫鎖定等待隊(duì)列 (Pending write-lock queue)中沒有更高優(yōu)先級(jí)的寫鎖定在等待
(只影響寫操作)
寫鎖定
(影響讀操作,同時(shí)也影響寫操作)
4.  MySQL中主要分4中隊(duì)列來(lái)維護(hù)這兩種鎖定:
兩個(gè)存放當(dāng)前正在鎖定的讀和寫鎖定信息,另外兩個(gè)存放等待中的讀寫鎖定西信息,如下:
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í)鎖定分為四種類型
共享鎖 (有叫做:讀鎖)
允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)的排它鎖。
排他鎖 (有叫做:寫鎖)
允許獲得排它鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)
意向共享鎖
意向排他鎖
6.  InnoDB 間隙鎖
InnoDB 的鎖定是通過在指向數(shù)據(jù)記錄的第一個(gè)索引鍵之前和最后一個(gè)索引鍵之后的空域空間標(biāo)記鎖定信息實(shí)現(xiàn)的。這種鎖定方式被稱為 "NEXT-KEY locking"(間隙鎖)
間隙鎖弱點(diǎn):鎖定一個(gè)范圍之后,即使某些不存在的鍵值也會(huì)被無(wú)辜鎖定,造成鎖定的時(shí)候無(wú)法插入鍵值鎖定內(nèi)的任何數(shù)據(jù)。
通過索引實(shí)現(xiàn)鎖定的方式存在其他幾個(gè)較大的性能隱患:
當(dāng) Query 無(wú)法利用索引的時(shí)候,InnoDB 會(huì)放棄使用 行級(jí)鎖定 而改用 表級(jí)鎖定 ,造成并發(fā)性能降低;
當(dāng) Query 使用的索引并不包含所有過濾條件時(shí),數(shù)據(jù)檢索使用到的索引鍵中的數(shù)據(jù)可能有部分不屬于 Query 的結(jié)果集行列,但是也會(huì)被鎖定,因?yàn)殚g隙鎖鎖定的是一個(gè)范圍,而不是具體的索引鍵。
當(dāng) Query 在使用索引定位數(shù)據(jù)的時(shí)候,如果使用的索引鍵一樣但訪問的數(shù)據(jù)行不同 (索引只是過濾條件的一部分), 他們一樣會(huì)被鎖定。
7. MyISAM 表鎖優(yōu)化建議
縮短鎖定時(shí)間
盡量減少大的復(fù)雜 Query,將復(fù)雜 Query 拆分成幾個(gè)小的 Query 執(zhí)行。
盡可能地建立足夠高效的索引,讓數(shù)據(jù)檢索更迅速。
盡量讓MyISAM 存儲(chǔ)引擎的表只存放必要的信息,控制字段類型。
利用合適的機(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è)控制是否打開 Concurrent insert 功能的參數(shù)選項(xiàng): concurrent_insert 可以設(shè)置為 0/1/2:具體如下:
合理利用讀寫優(yōu)先級(jí)
表級(jí)鎖定 默認(rèn)情況下寫優(yōu)先級(jí)大于讀,如果讀操作多的時(shí)候,可以設(shè)置讀優(yōu)先級(jí)高,可設(shè)置參數(shù) low_priority_updates = 1。
8.  InnoDB 行鎖優(yōu)化建議
盡可能讓所有的數(shù)據(jù)檢索都通過索引來(lái)完成,從而避免 InnoDB 因?yàn)闊o(wú)法通過索引鍵加鎖而升級(jí)為表級(jí)鎖定
合理設(shè)計(jì)索引,讓 InnoDB 在索引鍵上加鎖的時(shí)候盡可能準(zhǔn)確,盡可能地縮小鎖定范圍,避免造成不必要的鎖定而影響其他 Query 的執(zhí)行。
盡可能減少基于范圍的數(shù)據(jù)檢索過濾條件,避免因間隙鎖帶來(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)用情況查詢
MySQL 內(nèi)部有兩組專用的狀態(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 是比較合適的,在大就需要分析問題所在。
           兩個(gè)狀態(tài)值都是從系統(tǒng)啟動(dòng)后開始記錄,每出現(xiàn)一次加1,如果這里 Table_locks_waited 狀態(tài)值比較高,說明表級(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)打開 InnoDB的 monitor 功能
mysql > create table innodb_monitor(a int) engine=innodb;
然后執(zhí)行 ”show innodb status" 查看詳細(xì)信息
   為什么創(chuàng)建 innodb_monitor 表?
創(chuàng)建該表就是告訴InnoDB 我們要開始監(jiān)控他的詳細(xì)信息,然后InnoDB就會(huì)將比較詳細(xì)的事務(wù)級(jí)鎖定信息記錄到MySQL的 error log 中,以便后面做進(jìn)一步分析。

大云網(wǎng)官方微信售電那點(diǎn)事兒

責(zé)任編輯:任我行

免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
我要收藏
個(gè)贊
?
主站蜘蛛池模板: 97se亚洲综合在线韩国专区福利 | 中文字幕一级毛片视频 | 日本理论片免费高清影视在线观看 | 欧美日韩视频免费播放 | 亚洲欧美日产综合在线看 | 欧美激情精品久久久久久久久久 | 欧美日韩国产一区二区三区在线观看 | 国产成人亚洲合集青青草原精品 | 99热久久国产精品免费看 | 伊人久久综合热青草 | 成人观看网站a | 米奇777第四久久久99 | 欧美日韩亚洲国内综合网俺 | 国产激情一级毛片久久久 | 欧美片能看的一级毛片 | 看片亚洲 | 另类专区亚洲 | 久久综合免费 | 国产成人免费a在线资源 | 欧美一级特黄高清免费 | 国产视频久久久久 | 午夜国产精品不卡在线观看 | 男人操女人逼逼视频 | 亚洲精品美女在线观看 | 热久久伊人 | 欧美成人性色区 | 国产精品久久久久久影视 | 亚洲成人网页 | 亚洲欧美成人综合在线 | 久久久久久久免费 | 国产成人精品免费视频软件 | 久久99这里只有精品国产 | 久久人视频 | 请看一下欧美一级毛片 | 成人69视频在线观看免费 | 国产一区国产二区国产三区 | 九九热视频精品在线观看 | 国产精品永久在线 | 国产手机国产手机在线 | 成人在线免费视频 | 久久精品国产亚洲综合色 |