天天看點

淺談Mysql原理與優化(四)—— 存儲引擎

我們先回顧一下之前的MySQL架構圖

淺談Mysql原理與優化(四)—— 存儲引擎

存儲引擎

存儲引擎是mysql非常獨特的一個設計,使用這個抽象的概念封裝了資料庫的具體的存儲實作,隻保留了統一的接口。

這樣的優點是不同的開發者可以根據自己的需要實作不同功能的存儲引擎。但是缺點是,上層的處理引擎不了解存儲引擎的細節無法自己針對其優點進行性能上的優化。是以程式員需要更好的了解這些存儲引擎的設計細節,從程式設計方面來讓資料庫獲得更好的性能。

下面列出了一些mysql常用的存儲引擎

淺談Mysql原理與優化(四)—— 存儲引擎

種類有很多,功能也各有不同,使用較多的是Innodb和MyIsam,我們主要從存儲的細節上來了解一下他們的不同。

存儲形式主要有兩種:堆表、聚集表。

堆表

堆表是指所有的資料按照增加的時間順序排列在一起,沒有特殊的排序。大概類似于如下的形式。

淺談Mysql原理與優化(四)—— 存儲引擎

典型代表:MyISAM

優點是

  1. 資料按照插⼊順序排列列,插⼊入性能很⾼
  2. 每⾏資料⽤隐藏的rowid辨別(可以了解成資料位置)
  3. 所有索引記錄最終指向rowid,這樣按索引掃描的性能也不錯。

但是MyISAM存儲引擎有個很大的問題,就是它不支援事務,有沒有日志機制,會導緻在斷電時表crash。交易性業務,或者資料安全性要求比較高的場景,不太推薦使用這種存儲引擎。

聚集表

聚集這個詞稍有有些不好了解,其實意思就是所有的資料按照某一種特定的順序(比如主鍵的大小)進行排列,而不是按照增加的時間順序。

淺談Mysql原理與優化(四)—— 存儲引擎

典型代表:InnoDB

  1. 資料按主鍵順序排列存儲,形成樹狀,主鍵和資料形成同一個資料結構。
  2. 每⾏資料以主鍵辨別
  3. 主鍵通路非常快,⾮主鍵索引指向主鍵,通過主鍵再通路資料,有一個二次查找的開銷。

從這裡我們可以看出Innodb得主鍵查詢非常優秀,但是這樣的排序存儲有一個問題,如果頻繁的在資料表中間插入資料,會導緻索引結構的不斷更新,反而會影響插入的速度。

是以在實踐中,我們通常使用順序增加的鍵作為主鍵,在保持主鍵查詢性能的同時獲得更好的插入性能。

除了以上存儲的特性之外,Innodb最重要的特性是支援事務,可以在資料庫斷電,或者當機之後恢複到資料一緻的狀态。

資料的安全性通常是我們最優先考量的名額,由于這個重要的性質,是以在雲服務的絕大多數場合,我們更推薦使用Innodb這個存儲引擎。