其實MySQL提供的表類型截至到今天已經有13種,各有各的好處,但是民間流傳的常用的應該是7種,如果再細化出來,基本上就只有兩種:InnoDB、MyIASM兩種。
MySQL作為當前最為流行的免費數據庫服務引擎,已經風靡了很長一段時間,不過也許也有人對於MySQL的內部環境不很了解,尤其那些針對並發性處理的機制。
MySQL向用戶提供了包括DBD、HEAP、ISAM、MERGE、MyIAS、InnoDB以及Gemeni這7種MySQL表類型。其中DBD、InnoDB屬於事務安全類表,而其他屬於事務非安全類表。
1、DBD
Berkeley DB(DBD)表是支持事務處理的表,由Sleepycat軟件公司開發。它提供MySQL用戶期待已久的功能--事務控制。事務控制在任何數據庫系統中都是一個極有價值的功能,因為它們確保一組命令能成功地執行或回滾。
BerkeleyDB表(TYPE=BDB)是為了滿足MySQL開發者對事務安全表日益增長的需求而發展起來的。BerkeleyDB表具有特性,包括提交和回滾操作、多用戶並發訪問、檢查點、次要索引、通過日志恢復崩潰、連續地和鍵控地訪問數據等,這便利復雜的、基於事務的SQL有了可行的選擇。
不過BerkeleyDB表也有一些限制:
- 它的移動比較困難(在創建時,表路徑硬編碼在表文件中)
- 不能壓縮表索引,而且其表通常比MyISAM相應的表要大
- 有點雞肋的感覺,因為現在InnoDB格式很大程度上可以取代BerkeleyDB格式
2、HEAP
HEAP表是MySQL中存取數據最快的表。這是因為他們使用存儲在動態內存中的一個散列索引,不過如果MySQL或服務器崩潰,這些內存數據將會丟失。
HEAP表(TYPE=HEAP)是內存中的表,它使用能夠比較快速的散列索引(當運行INSERT查詢時,獨立評價指出HEAP表最少比MyISAM表快30%),因此,對於臨時表可以優化。經和MyISAM或ISAM表的訪問規則和使用方式一樣。存儲在里面的數據只在MySQL服務器的生命期內存在,如果MySQL服務器崩潰或者被關掉,都會使其中的數據消失不見。雖然HEAP表具有性能方面的好處,但是由於它的臨時性和一些其他功能限制,在實際中不可能經常使用。
HEAP表的大小只受到系統上可用內存的限制,MySQL是很聰明的,其具有內建保護來阻止無意識地使用所有可用內存。所以我們不用擔心內存會被HEAP表用盡。HEAP表不支持BLOB或TEXT列,不能超過max_heap_table_size變量指定的大小。
3、ISAM
ISAM表是早期MySQL版本的缺省表類型,直到MyIASM開發出來。建議不要再使用它。
ISAM表(TYPE=ISAM)和MyISAM表相似,但是其沒有MyISAM格式的很多增強性能,因而不能像MyISAM類型那樣提供很好的優化和執行效率。因為ISAM索引不能被壓縮,它比在MyISAM中的相同索引戰勝較少的系統資源。ISAM索引需要較多的磁盤空間,這對於像本站的這種小型環境很是問題。
和MyISAM一樣,ISAM表可以是固定長度的,也可以是可變長度的,但是其格式的最大鍵長度比較小,ISAM格式處理的表不能大於4G,而且表不能在不同的平台間移植。另外,ISAM表容易分裂,這會降低查詢速度,對數據/索引的壓縮產生限制。
4、MERGE
MERGE是一個有趣的新類型,在3.23.25之后出現。一個MERGE表實際上是又一個MyISAM表的集合,合並而成的一個表,主要是為了效率的考慮,因為這樣不僅僅可以提高速度、搜索效率、修復效率而且還節省了磁盤空間。
- MERGE表(TYPE=MERGE)是通過把多個MyISAM表組合到一個單獨的表來創建的一種虛擬表。
- 只有涉及到的表具有完全相同的表結構時才能對表進行組合。字段類型或者索引的任何不同都不能進行成功的結合。
- MERGE表使用組成表的索引,並且不能維持它本身的索引,在某種情況下可以提高速度。
- 允許SELECT,DELETE,UPDATE操作
- 在需要把不同表的數據放到一起提高連接的性能或者在一系列表中進行搜索時,這種表很實用。
- 處理大的MyISAM表時,我們可以通過壓紋或者使用MySQL發布中包含的myisampack實用工具進行“打包”來減少這些表戰勝的空間。myisampack創建比較小的只讀表,而不會在使用智能壓縮時導致任何大的性能開銷。
5、MyIASM
MyIASM基於了IASM代碼,應該可以說是IASM的衍生品,不過增加了不少有用的擴展。它是MySQL的默認數據表類型,基於了傳統的ISAM類型,ISAM是Indexed Sequential Access Method(有索引的順序訪問方法)的縮寫,一般來說,它是存儲記錄和文件的標准方法。與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具。ISAM表格可以被壓縮,而且它們支持全文搜索,不過它們是事務不安全的,而且也不支持外鍵。如果事務回滾將會造成不完全回滾,從而不具備原子性。所以假如忽略事務以及訪問並發性的話,並且需要執行大量的SELECT檢索語句的話,MyISAM將是最好的選擇。
- MyISAM表(TYPE=MYISAM)是ISAM類型的一種延伸,具有很多優化和增強的特性。
- 是MySQL的默認表類型。
- MyISAM優化了壓縮比例和速度,並且可以很方便的在不同的操作系統和平台之間進行移植。
- MyISAM支持大表文件(大於4G)
- 允許對BLOB和TEXT列進行索引
- 支持使用鍵前綴和使用完整的鍵搜索記錄
- 表數據和表索引文件可以依存在不同的位置,甚至是不同的文件系統中。
- 即使是具有相當多的插入、更新和刪除操作的表,智能防碎片邏輯也能保證其高性能的協作性。
6、InnoDB
InnoDB是MySQL 4.0之后推出的一種比較新的數據表類型,這種類型是事務安全的。它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它。如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,同樣應該使用InnoDB表。對於支持事務的InnoDB類型的表來說,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN開始事務,導致每插入一條都自動提交,嚴重影響了速度。可以在執行SQL前調用begin,多條SQL形成一個事物(即使autocommit打開也可以),將大大提高性能。
InnoDB表(TYPE=INNODB),是一個完全兼容ACID(事務的原子性、一致性、獨立性及持久性)的、高效率的表完全支持MySQL的事務處理並且不會btwagkyaakftntce。精細的(行級和表級)鎖提高了MySQL事務處理的帶走度,同時其也支持無鎖定讀操作(以前只在Oracle中包含)和多版本的特性。
異步輸入/輸出和一系列的讀緩沖將提高數據檢索速度,同時可以進行文件的優化和內存的管理。需要的基礎上支持自動在內存上創建散列索引來提高性能,使用緩沖來提高可靠性和數據庫操作的速度。InnoDB表可以和MyISAM相媲美,甚至已經超過了MyISAM。
在不同的操作系統和體系結構上是完全可移植的。由於一直處於一致的狀態(MySQL通過在啟動時檢查錯誤並修復錯誤來使它們更加健壯)。對外鍵、提交、回滾和前滾的操作的支持,使其成為MySQL中最完善的表格式。
7、Gemeni
Gemeni表,據聽說也是在MySQL 4.0之后推出的,不過截至當前,很少有針對它的介紹,同樣應用也就更少了,我們暫時不作介紹。
總結:
MySQL的數據表類型很多,其中比較重要的是MyISAM,InnoDB這兩種。
這兩種類型各有優缺點,需要根據實際情況選擇適合的,MySQL支持對不同的表設置不同的類型。下面做個簡單的對比:
MyISAM表類型是一種比較成熟穩定的表類型,但是MyISAM對一些功能不支持。
參考:
http://database.51cto.com/art/201010/230057.htm(以上內容部分轉自此篇文章)
http://www.xiaoxiaozi.com/2009/07/14/1171/(以上內容部分轉自此篇文章)
