1、對(duì)于MySQL來(lái)說(shuō),有三種鎖的級(jí)別:頁(yè)級(jí)、表級(jí)、行級(jí)
頁(yè)級(jí)的典型代表引擎為BDB。
表級(jí)的典型代表引擎為MyISAM,MEMORY以及很久以前的ISAM。
行級(jí)的典型代表引擎為INNODB。
2、我們實(shí)際應(yīng)用中用的最多的就是行鎖
行級(jí)鎖的優(yōu)點(diǎn)如下:
1)、當(dāng)很多連接分別進(jìn)行不同的查詢時(shí)減小LOCK狀態(tài)。
2)、如果出現(xiàn)異常,可以減少數(shù)據(jù)的丟失。因?yàn)橐淮慰梢灾换貪L一行或者幾行少量的數(shù)據(jù)。
行級(jí)鎖的缺點(diǎn)如下:
1)、比頁(yè)級(jí)鎖和表級(jí)鎖要占用更多的內(nèi)存。
2)、進(jìn)行查詢時(shí)比頁(yè)級(jí)鎖和表級(jí)鎖需要的I/O要多,所以我們經(jīng)常把行級(jí)鎖用在寫操作而不是讀操作。
3)、容易出現(xiàn)死鎖。
3、MySQL用寫隊(duì)列和讀隊(duì)列來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的寫和讀操作
對(duì)于寫鎖定如下:
1)、如果表沒(méi)有加鎖,那么對(duì)其加寫鎖定。
2)、否則,那么把請(qǐng)求放入寫鎖隊(duì)列中。
對(duì)于讀鎖定如下:
1)、如果表沒(méi)有加寫鎖,那么加一個(gè)讀鎖。
2)、否則,那么把請(qǐng)求放到讀鎖隊(duì)列中。
當(dāng)然我們可以分別用low_PRiority 以及high_priority在寫和讀操作上來(lái)改變這些行為。
4、下面我來(lái)一個(gè)簡(jiǎn)單的例子解釋上面的說(shuō)法
我們來(lái)運(yùn)行一個(gè)時(shí)間很長(zhǎng)的查詢
1)、客戶端1:
mysql> select count(*) from content group by content;
…
客戶端2:
mysql> update content set content = ‘I love you’ where id = 444;
Query OK, 1 row affected (30.68 sec)
Rows matched: 1  Changed: 1  Warnings: 0
用了半分鐘。
2)、我們現(xiàn)在終止客戶端1。
此時(shí)客戶端2:
mysql> update content set content = ‘I hate you’ where id = 444;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
僅僅用了20毫秒。
這個(gè)例子很好的說(shuō)明了讀寫隊(duì)列的運(yùn)行。
對(duì)于1中的客戶端1,此時(shí)表沒(méi)有加鎖,當(dāng)然也沒(méi)有加寫鎖了,那么此時(shí)客戶端1對(duì)表加了一個(gè)讀鎖。
對(duì)于1中的客戶端2,此時(shí)因?yàn)楸碛幸粋€(gè)讀鎖,所以把UPDATE請(qǐng)求放到寫鎖定隊(duì)列中。
當(dāng)讀鎖釋放的時(shí)候,也就是SHOW PROCESSLIST中STATUS 為COPY TO TMP TABLE的時(shí)候,UPDATE操作開(kāi)始執(zhí)行。
5、可以在REPLICATION中對(duì)MASTER 和SLAVE運(yùn)用不同的鎖定使系統(tǒng)達(dá)到最佳的性能
當(dāng)然這個(gè)前提是SQL語(yǔ)句都是最優(yōu)的。
新聞熱點(diǎn)
疑難解答
圖片精選