數據庫的一些基本知識(1)------數據庫引擎

MySQL數據庫提供了十三種不同的存儲引擎來應對不同的數據處理。大部分使用過MySQL的人應該都知道MySQL所常用的兩個存儲引擎:MyISAM 和 InnoDB。大多數情況下,MyISAM 是作爲MySQL默認的存儲引擎而存在的。事實上我們大多數人在使用MySQL的時候都沒有去配置存儲引擎而直接採用MySQL默認的MyISAM 。如果你需要在特定的表上面使用特定的存儲引擎,你可以使用下面的命令行:

CREATE TABLE tablename (column1, column2, [etc...]) ENGINE = [storage_engine].

那麼什麼是數據庫引擎呢?

簡單說來,一個數據庫的存儲引擎就是用來對數據表進行信息存儲、處理、查詢等操作。這個世界上不存在十全十美的存儲引擎,但是對於大部分的應用來說,默認的MyISAM 就夠用了。在MySQL內置的10種不同的存儲引擎中,並不是所有的引擎都是可用的。你可以使用下面的命令來查詢你的MySQL服務器提供的存儲引擎:

代碼:
mysql -uroot -p
Password:
mysql> show engines;
這個命令會列出你的服務器所支持的存儲引擎列表:
  • MyISAM
  • InnoDB
  • MERGE
  • MEMORY (HEAP)
  • BDB (BerkeleyDB)
  • EXAMPLE
  • ARCHIVE
  • CSV
  • BLACKHOLE
  • ISAM
你可以根據你自己的應用需求來選擇對於的存儲引擎。例如,如果你需要存儲大量的日誌數據,那麼你可以使用只支持INSERTSELECT操作的ARCHIVE 存儲引擎。你可以對你的數據庫服務器、數據庫或者表格設置特定的存儲引擎,這種靈活的可配置性也是MySQL比起那些只支持單一存儲引擎的數據庫更加受歡迎的原因。

MyISAM

MyISAM 事實上是 ISAM 存儲引擎的一個分支。如果你的應用不需要TRANSACTION,也不需要行級別的鎖(它只提供表級別的鎖),那麼這是選擇MyISAM是最優方案了。MyISAM 特別適合於INSERT/UPDATE操作少而SELECT 操作多的應用場景。當你的應用需要進行大量的INSERT/UPDATE操作時,你需要考慮是否應該換一個存儲引擎,因爲表級別的鎖會讓這個操作造成性能問題。

MyISAM 支持的最大行數爲 ~4.29E+09,每個表的索引數目限制爲64。MyISAM 同時也爲 TEXT/BLOB類型的列提供了全索引支持,這樣很方便進行搜索等操作。

InnoDB

相對於MyISAM, InnoDB提供了更多特性來提升系統性能。這也導致了InnoDB在初始化的時候會比MyISAM花更多的時間,但是這樣帶來的好處遠比初始化額外花的時間要多。其中一個主要的不同就是InnoDB提供了行級別的鎖。這就爲併發的 INSERT/UPDATE/DELETE 操作提供了可能,不像MyISAM那樣要等一個操作完成才能進行下一個操作。

同時, InnoDB 還提供了外鍵功能。這可以保證你在往表二插入數據之前表一的相關數據已經存在。而且這還會阻止你在表一中刪除表二所依賴的數據。

InnoDB還提供了數據的緩存已經在內存和磁盤上建立索引,這樣可以大大的提升系統性能。也許對於那些低內存的系統來說,這不是一個理想的解決方案,但是對於內存足夠的系統來說就不是問題了。


MERGE
MERGE MySQL 3.23.25 開始添加的存儲引擎。它讓用戶可以對一個MyISAM 集合進行統一操作,就像是操作一個表一樣。但是使用這個引擎有一些約束,比如所有的表格都必須是統一的定義。 

MEMORY (HEAP)
HEAP 存儲引擎,也叫做 MEMORY,允許在內存裏面建表。MySQL 服務器會保留表的格式,這樣可以快速的創建一個“trash”表,然後快速的讀取數據以便更好的處理。不過這也使得這個存儲引擎不適合長期的數據處理。

BDB (BerkeleyDB)

BerkeleyDB存儲引擎處理事務安全的表,並以哈希爲基礎的存儲系統。這個存儲引擎適合快速的讀寫某些數據,特別是不同key的數據。但是這個存儲引擎有不少缺點,比如在沒有索引的列上速度很慢。也因爲這個原因人們都忽視了它。我還是相信它有它的用武之地。


EXAMPLE

EXAMPLE,從MySQL 4.1.3 開始添加的存儲引擎。這個存儲引擎主要是爲程序員服務的。EXAMPLE 提供了創建表的能力,但是無法插入或者查詢信息。


ARCHIVE
ARCHIVE,從MySQL 4.1.3 開始添加的存儲引擎,它經常被用來存儲大規模數據(無需索引)。這個存儲引擎只支持 INSERT 和 SELECT操作,而且所有的信息都是被壓縮過的。這些特性讓ARCHIVE很適合用來存儲日誌、交易記錄、賬戶等。不過需要注意的是,在讀取數據的時候,整個表都需要在數據返回之前解壓並讀取。因此這個存儲引擎最適合使用頻率較低的場景。

CSV
CSV, 從MySQL 4.1.4開始添加的存儲引擎,以逗號分隔的字符串存儲數據。因此這個存儲引擎不適合大規模的數據存儲或者需要索引的數據表等場景。這個存儲引擎適合將數據轉成spreadsheet 文件。

BLACKHOLE
這個存儲引擎似乎看起來沒什麼用處,因爲它不允許任何數據的存儲或者查詢。因此BLACKHOLE 通常被用來測試數據庫的結構、索引和擦查詢。你仍然可以使用 INSERTS 命令來插入,只不過所有的數據都是void

ISAM
最原始的存儲引擎就是ISAM, 它管理着非事務性表。後來它就被MyISAM 代替了,而且MyISAM 是向後兼容的,因此你可以忘記這個ISAM存儲引擎。

總結
總的說來,沒有十全十美的數據庫存儲引擎。對於大多數的應用和DBA來說,選用InnoDB 和 MyISAM 基本就夠用了。但是也要記住,InnoDB 和 MyISAM 雖然比較通用,但是它們並不是對所有的場景都是完美支持的,也許其他的存儲引擎可以很好地支持你的應用。



下一集預告:

數據庫事務隔離機制及特點;


參考文獻:

1、http://www.linux.org/threads/an-introduction-to-mysql-storage-engines.4220/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章