mysql的存儲引擎有那些? 它們的區別是


引擎是什么?
MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。
 
在文件系統中,MySQL將每個數據庫(也可以稱之為schema)保存為數據目錄下的一個子目錄。創建表時,MySQL會在數據庫子目錄下創建一個和表同名的.frm文件保存表的定義。例如創建一個名為 MyTable的表,MySQL會在MyTable.frm文件中保存該表的定義。
因為MySQL使用文件系統的目錄和文件來保存數據庫和表的定義,大小寫敏感性和具體的平台密切相關。在Windows中,大小寫是不敏感的;而在類Unix中則是敏感的。不同的存儲引擎保存數據和索引的方式是不同的,但表的定義則是在MySQL服務層統一處理的。
 
查看支持的引擎
show engines;
 
 
查看已有表信息
show table status likeuser’ \G
 
Name:表名
Engine:存儲引擎
Row_format:行格式
Rows:行數,MyISAM是准確的,InnoDB是估計值
Avg_row_length:平混每行字節數
Data_length:表數據大小
Max_data_length:表數據最大容量,與存儲引擎有關。
Index_length:索引大小(字節)
Data_free:已分配但未使用空間
Auto_increment: 下一個Auto_increment值,自增主鍵是下一個主鍵的值
Create_time: 表創建時間
Update_time: 表數據最后更新時間
Check_time: 使用ckeck table或者myisamchk工具最后檢查時間
Collation: 默認字符集和字符排序規則
Checksum: 如果啟用,保存整個表的實時校驗和
Create_options: 創建指定的其他選項
Comment: 其他額外信息,一般用作表備注
 
InnoDB
InnoDB是MySQL默認的事務型引擎,也是最重要、最廣泛的存儲引擎。它的設計是用來處理大量短期事務,短期事務大部分是正常提交的,很少回滾。InnoDB的性能和自動崩潰恢復特性,使得它在非事務型存儲的需求中,也很流行。除了非常特別的原因需要使用其他引擎,InnoDB也是非常好值得花時間研究的對象。
InnoDB的數據存儲在表空間中,表空間是由InnoDB管理的黑盒文件系統,由一系列系統文件組成。InnoDB可以將每個表的數據和索引存放在單獨的文件中。InnoDB也可以使用裸設備作為表空間存儲介質。
InnoDB通過間隙鎖(next-key locking)防止幻讀的出現。InnoDB是基於聚簇索引建立,與其他存儲引擎有很大的區別,聚簇索引對主鍵查詢有很高的性能,不過它的二級索引(secondary index,非主鍵索引)必須包含主鍵列。所以如果主鍵列很大的話,索引會很大。
 
MyISAM
在5.1之前,MyISAM是默認的引擎,MyISAM有大量的特心態,包括全文索引、壓縮、空間函數。但是MyISAM不支持事務和行級鎖,而且在崩潰后無法安全恢復。即使后續版本中MyISAM支持了事務,但是很多人的概念中依然是不支持事務的引擎。
MyISAM並不是無所事處。對於一些只讀數據,或 者表空間較小,可以忍受恢復操作,可以使用MyISAM。MyISAM會將表存儲在兩個文件中:數據文件、索引文件。分別是.MYD、.MYI擴展名。MyISAM表可以包含動態或者靜態行。MySQL會根據表定義選擇那種行格式。MyISAM表的行記錄數,取決於磁盤空間和操作系統中的單個文件最大尺寸。
在MySQL中,默認配置只能存儲256TB的數據。因為指向數據記錄的指針長度是6字節。需要修改可以修改表的MAX_ROWS和AVG_ROW_LENGTH選項。兩個相乘是最大的大小。會導致重建索引。
MyISAM是對整個表加鎖,而不是行鎖,讀取的時候對表加共享鎖,寫入的時候加排他鎖。但是在表有讀取查詢的同時,也可以往表內寫入記錄。
對於MyISAM,即使是Blob,Text等等長字段,也可以基於前500字符創建索引,MyISAM支持全文索引,這是一個基於分詞創建的索引,也可以支持復雜的查詢。
MyISAM可以選擇延遲更新索引鍵,在創建表的時候指定delay_key_write選項,在每次修改執行完成時,不會立刻將修改的索引數據寫入磁盤,而是寫到緩存區,只有在清理緩存區或者關閉表的時候才會將索引寫入磁盤。這可以極大的提升寫入性能,但是在主機崩潰時會造成索引損壞,需要執行修復操作。
MyISAM另一個特性是支持壓縮表。如果數據在寫入后不會修改,那么這個表適合MyISAM壓縮表。可以使用myisampack對MyISAM表進行打包,壓縮表是不可以修改數據的。壓縮表可以極大的減少磁盤占用,因此可以減少磁盤IO,提升性能,壓縮表也支持索引,但是索引也是只讀的。
整體來說MyISAM並沒有那么不堪,但是由於沒有行鎖機制,所以在海量寫入的時候,會導致所有查詢處於Locked狀態。

 

Blackhole
Blackhole沒有實現任何存儲機制,它會舍棄所有寫入數據,不做任何保存,但是服務器會記錄Blackhole表的日志,用於復制數據到備庫,或者只是簡單的記錄到日志,這種特殊的存儲引擎可以在一些特俗的復制架構和日志審核時發揮作用。但是不推薦。

 

Memroy
如果需要快速地訪問數據,並且這些數據不會被修改,重啟以后丟失也沒有關系,那么使用Memory表(以前也叫做HEAP表)是非常有用的。Memory表至少比MyISAM表要快一個數量級,因為所有的數據都保存在內存中,不需要進行磁盤I/O。Memory表的結構在重啟以后還會保留,但數據會丟失。
Memroy表在很多場景可以發揮好的作用:
  1. 用於查找(lookup)或者映射(mapping)表,例如將郵編和州名映射的表。
  2. 用於緩存周期性聚合數據(periodicallyaggregateddata)的結果。
  3. 用於保存數據分析中產生的中間數據。
Memory表支持Hash索引,因此查找操作非常快。雖然Memory表的速度非常快,但還是無法取代傳統的基於磁盤的表。Memroy表是表級鎖,因此並發寫入的性能較低。它不支持BLOB或TEXT類型的列,並且每行的長度是固定的,所以即使指定了VARCHAR列,實際存儲時也會轉換成CHAR,這可能導致部分內存的浪費。如果MySQL在執行查詢的過程中需要使用臨時表來保存中間結果,內部使用的臨時表就是Memory表。如果中間結果太大超出了Memory表的限制,或者含有BLOB或TEXT字段,則臨時表會轉換成MyISAM表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM