我們先回顧一下之前的MySQL架構圖
存儲引擎
存儲引擎是mysql非常獨特的一個設計,使用這個抽象的概念封裝了數據庫的具體的存儲實現,只保留了統一的接口。
這樣的優點是不同的開發者可以根據自己的需要實現不同功能的存儲引擎。但是缺點是,上層的處理引擎不瞭解存儲引擎的細節無法自己針對其優點進行性能上的優化。所以程序員需要更好的理解這些存儲引擎的設計細節,從程序設計方面來讓數據庫獲得更好的性能。
下面列出了一些mysql常用的存儲引擎
種類有很多,功能也各有不同,使用較多的是Innodb和MyIsam,我們主要從存儲的細節上來理解一下他們的不同。
存儲形式主要有兩種:堆表、聚集表。
堆表
堆表是指所有的數據按照增加的時間順序排列在一起,沒有特殊的排序。大概類似於如下的形式。
典型代表:MyISAM
優點是
- 數據按照插⼊順序排列列,插⼊入性能很⾼
- 每⾏數據⽤隱藏的rowid標識(可以理解成數據位置)
- 所有索引記錄最終指向rowid,這樣按索引掃描的性能也不錯。
但是MyISAM存儲引擎有個很大的問題,就是它不支持事務,有沒有日誌機制,會導致在斷電時表crash。交易性業務,或者數據安全性要求比較高的場景,不太推薦使用這種存儲引擎。
聚集表
聚集這個詞稍有有些不好理解,其實意思就是所有的數據按照某一種特定的順序(比如主鍵的大小)進行排列,而不是按照增加的時間順序。
典型代表:InnoDB
優點是
- 數據按主鍵順序排列存儲,形成樹狀,主鍵和數據形成同一個數據結構。
- 每⾏數據以主鍵標識
- 主鍵訪問非常快,⾮主鍵索引指向主鍵,通過主鍵再訪問數據,有一個二次查找的開銷。
從這裡我們可以看出Innodb得主鍵查詢非常優秀,但是這樣的排序存儲有一個問題,如果頻繁的在數據表中間插入數據,會導致索引結構的不斷更新,反而會影響插入的速度。
所以在實踐中,我們通常使用順序增加的鍵作為主鍵,在保持主鍵查詢性能的同時獲得更好的插入性能。
除了以上存儲的特性之外,Innodb最重要的特性是支持事務,可以在數據庫斷電,或者死機之後恢復到數據一致的狀態。
數據的安全性通常是我們最優先考量的指標,由於這個重要的性質,所以在雲服務的絕大多數場合,我們更推薦使用Innodb這個存儲引擎。