面試常問MySQL性能優化問題


 

知識綜述

[1] MySQL中鎖的種類:

常見的表鎖和行鎖,也有Metadata Lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致並發能力下降,一般是做ddl處理時使用。

行鎖則是鎖住數據行,這種加鎖方法比較復雜,但是由於只鎖住有限的數據,對於其它數據不加限制,所以並發能力強,MySQL一般都是用行鎖來處理並發事務

     [2] MySQL四種隔離機制

未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務修改的數據。

提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重復讀)。

可重復讀(Repeated Read):可重復讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標准中,該隔離級別消除了不可重復讀,但是還存在幻象讀。

串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。

[3]多版本並發控制MVCC

MySQL InnoDB存儲引擎,實現的是基於多版本的並發控制協議——MVCC.

MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不沖突。在讀多寫少的OLTP應用中,讀寫不沖突是非常重要的,極大的增加了系統的並發性能,這也是為什么現階段,幾乎所有的RDBMS,都支持了MVCC。

在MVCC並發控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read).

     快照讀:簡單的select操作,屬於快照讀,不加鎖。(當然,也有例外,下面會分析)

        select * from table where ?;

     當前讀:特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。  

       select * from table where ? lock in share mode;

                    select * from table where ? for update;

                    insert into table values (…);

                    update table set ? where ?;

                    delete from table where ?;





1、如何理解MySQL中加鎖原理

mysql加鎖機制 :

根據類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。

根據粒度划分又分表鎖和行鎖。表鎖由數據庫服務器實現,行鎖由存儲引擎實現。

 

2、MySQL最終死鎖形成的原因 

爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.
此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的進程稱為死鎖進程.
表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的InnoDB.

死鎖的關鍵在於:兩個(或以上)的Session加鎖的順序不一致。

那么對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序

 

3、MySQL連接池的連接數說爆就爆了?

  出現這種錯誤明顯就是 mysql_connect 之后忘記 mysql_close;

  當大量的connect之后,就會出現Too many connections的錯誤。

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM