高效能mysql 第1章 mysql架構與曆史(1)

來源:互聯網
上載者:User

標籤:insert   過程   執行   寫日誌   資料檔案   oracle   服務層   comm   tab   

 

mysql邏輯架構圖:

 

第一層 用戶端

第二層(服務層):針對所有類型的儲存引擎可以公用提取的部分。將儲存引擎抽離之後的其他部分都在這裡。如:查詢解析,分析最佳化,內建函數,預存程序,觸發器,視圖。

第三層(儲存引擎層):儲存引擎負責mysql資料的儲存和提取。伺服器通過API與儲存引擎進行通訊。這些API屏蔽了不同儲存引擎的具體實現差異。儲存引擎API包含"開始一個事務","根據主鍵擷取一行資料"等操作。儲存引擎本身不會去解析sql。

註:mongdb也有儲存引擎。

 

資料庫通過讀鎖和寫鎖,又叫共用鎖定和排它鎖,來控制並發事務。

關於鎖粒度,mysql交給儲存引擎自己去管理,每種儲存引擎可以實現自己的鎖粒度和鎖策略。

不同的鎖策略,會帶來不同的效果,表鎖開銷最小,但是並發最差。行級鎖並發效能最好,但是開銷最大。

儘管鎖策略在儲存引擎上管理,但是在執行alter table這種操作的時候,服務層會直接使用表所,而忽視儲存引擎層的鎖機制。

 

隔離等級:

mysql支援四中隔離等級:

  • read uncommitted:未提交讀
  • read commited 提交讀(Oracle的預設隔離等級)
  • repeatable read 可重複讀(mysql的預設隔離等級)
  • serializable 序列化

 

註:可重複讀解決了不可重複讀取的問題(同一個資料在兩次讀取的時候結果不一樣)。序列化解決了幻讀的問題(兩次執行同一個where語句結果什麼結果條數不一致)。

疑惑:關於序列化,書上說mysql對每一行讀的資料都加鎖。如果這樣做的話,肯定能保證可重複讀,但是怎麼保證幻讀呢,因為對讀取的資料進行加鎖是不能阻塞insert操作的呢。

 

 

死結:關於死結的原因,一種是業務情境的操作導致,另外一些,是儲存引擎的實現方式導致的。

innodb能夠識別到死結現象,並復原持有最少排它鎖的事務。

 

交易記錄:

交易記錄可以提高事務的效率,mysql在update表的時候只需要修改記憶體中的資料,然後將修改行為記錄在硬碟的交易記錄中,這個事務的過程就算完了。不需要等待硬碟中的資料檔案被update才返回。交易記錄是硬碟上的一段順序儲存空間,可不是隨機的磁碟儲存,每次add都是採取追加的方式,交易記錄中的內容會持久化到硬碟資料檔案中。這種方式叫做預寫式日誌,需要寫兩次硬碟。

如果出現斷電,在重啟後,可以通過交易記錄恢複資料。

註:Mongodb最新的WiredTiger儲存引擎也有類似交易記錄的概念,不過不叫交易記錄,叫做預寫記錄檔(WAL: Write-Ahead Logging),因為mongdb沒有事務麼。

 

高效能mysql 第1章 mysql架構與曆史(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.