MySQL儲存引擎

2021-12-30 12:06:02 字數 3427 閱讀 5548

mysql儲存引擎,myisam、innodb、memory和merge是常用的4種儲存引擎。

myisam

myisam不支援事務、外來鍵,但訪問速度快,對事務完整性沒有要求或者以select、insert為主的應用基本上都可以使用myisam儲存引擎來建立表。

每個myisam對應的表在磁碟上儲存成3個檔案,其檔名和表名都相同,但副檔名分別是.frm(表定義)、.myd(儲存資料)、.myi(表索引)。資料檔案和索引檔案可以放置在不同的目錄,平均分布io,獲得更快的速度。資料檔案和索引檔案的路徑需要在建立表的時候通過data_directory和index_directory語句指定(檔案路徑需要是絕對路徑,並且具有訪問許可權)。

myisam型別的表可能會損壞,損壞的表可能不能訪問,會提示需要修復或者訪問後返回錯誤的結果。myisam型別的表提供修復的工具,可以用check table語句來檢查myisam表的健康,並用repair table語句修復乙個損壞的myisam表。表損壞可能導致資料庫異常重新啟動,需要盡快修復並盡可能確認損壞的原因。

myisam的表支援3種不同的儲存格式,分別是靜態(固定長度)表、動態表和壓縮表。

靜態表中字段都是非變長字段,每個記錄都是固定長度的,這種儲存方式的優點是儲存非常迅速,容易快取,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表的資料在儲存的時候會按照列的寬度定義補足空格,但是在應用訪問的時候並不會得到這些空格,因為空格在返回給應用之前就已經去掉了。需要注意的是,如果儲存的內容後面本來帶有空格,那麼在返回結果的時候也會被去掉;但內容前面的空格不會被去掉。

動態表包含變長字段,記錄不是固定長度的,優點是占用的空間相對較少,但是頻繁地更新刪除記錄會產生碎片,需要定期執行optimize table語句或myisamchk -r命令來改善效能,並且出現故障的時候恢復相對比較困難。

壓縮表由myisampack工具建立,佔據非常小的磁碟空間。每個記錄是單獨壓縮的,只有非常小的訪問開支。

innodb

innodb儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。與myisam相比,innodb寫的處理效率差一些並且會占用更多的磁碟空間以保留資料和索引。

自動增長列

innodb表的自動增長列可以手工插入,但如果插入的值是0或者空,則實際插入的將是自動增長後的值。可以通過「alter table * auto_increment = n;」語句修改自動增長列的初始值,預設從1開始。但該預設值是保留記憶體中的,如果該值在使用之前資料庫重新啟動,那麼這個強制的預設值就會丟失,需要在資料啟動以後重新設定。

對於innodb表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列。但對於myisam表,自動增長列可以是組合索引的其他列,插入記錄後,自動增長列是按照組合索引的前面幾列排序後遞增的。

外來鍵約束

在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。在建立索引的時候,可以指定在刪除、更新父表時,對子表進行相應的操作,包括restrict、cascade、set null和no action。其中restrict和no action相同,指限制在子表有關聯記錄的情況下父表不能更新;cascade表示父表在更新或者刪除時,更新或者刪除子表對應的記錄;set null表示父表在更新或刪除的時候,子表的對應欄位被設定為set null。

儲存方式

innodb儲存表和索引有以下兩種方式:

1) 使用共享表空間儲存,這種方式建立的表的表結構儲存在.frm檔案中,資料和索引儲存在innodb_data_home_dir和innodb_data_file_path定義的表空間中,可以是多個檔案。

2)使用多表空間儲存,表結構仍然儲存在.frm檔案中,但是每個表的資料和索引單獨儲存在.ibd中。如果是個分割槽表,則每個分割槽對應單獨的.ibd檔案,檔名是「表名+分割槽名」,可以在建立分割槽的時候指定每個分割槽的資料檔案的位置,以此將表的io均勻分布在多個磁碟上。

多表空間的資料檔案沒有大小限制,不需要設定初始大小,也不需要設定檔案的最大限制、擴充套件大小等引數。

對於使用多表空間特性的表,可以比較方便地進行單錶備份和恢復操作,但是直接複製.ibd檔案是不行的,因為沒有共享表空間的資料字典資訊,直接複製的.ibd檔案和.frm檔案恢復時不能被正確識別。

memory

memory儲存引擎使用存在記憶體中的內容來建立表。每個memory表只實際對應乙個磁碟檔案,格式是.frm。memory型別的表訪問非常快,因為它的資料是放在記憶體中,並且預設使用hash索引,但是一旦服務關閉,表中的資料就會丟失掉。

伺服器需要足夠的記憶體來維持所有在同一時間使用的memory表,當不再需要memory表的內容時,要釋放memory表使用的記憶體,應該執行delete from或truncate table,或者整個刪除表(drop table)。

每個memory表中可以放置的資料量大小受到max_heap_table_size系統變數的約束,這個系統變數的初始值是16m,可以按需加大。定義表的時候,可以通過max_rows子句指定表的最大行數。

memory型別的儲存引擎主要用在內容變化不頻繁的**表,或作為統計操作的中間結果表。

merge

merge儲存引擎是一組myisam表的組合,這些myisam表必須結構完全相同,merge表本身並沒有資料,對merge型別的表可以進行查詢、更新、刪除的操作,這些操作實際上是對內部的實際的myisam表進行的。對於merge型別表的插入操作,是通過insert_method子句定義插入的表,可以有3個不同的值,使用first或last值使得插入操作被相應地作用在第一或最後乙個表上,不定義這個子句或者定義為no,表示不能對這個merge表執行插入操作。

可以對merge表執行drop操作,僅僅刪除merge表定義,對內部的表沒有任何的影響。

merge表在磁碟上保留兩個檔案,檔名以表的名字開始,乙個.frm檔案儲存表定義,另乙個.mrg檔案包含組合表的資訊,包括merge表由哪些表組成、插入新的資料時的依據。可以通過修改.mrg檔案來修改merge表,但是修改後要通過flush tables重新整理。

如何選擇合適的儲存引擎

下面是常用儲存引擎的使用環境。

myisam:如果應用是以讀操作和插入操作為主,只有很少更新和刪除操作,並且對事務的完整性、併發性要求不是很高,選擇myisam是非常合適的。

innodb:用於事務處理應用程式,支援外來鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求資料的一致性,資料操作除了插入和查詢以外,還包括很多的更新、刪除操作,innodb比較合適。innodb除了有效降低由於刪除和更新導致的鎖定,還可以確保事務的完整提交和回滾。

memory:將所有資料儲存在ram中,在需要快速定位記錄和其他類似資料的環境中,可以提供極快的訪問。memory的缺陷是對錶的大小有限制,太大的表無法快取在記憶體中。常用語更新不太頻繁地小表,用以快速得到訪問結果。

merge:用於將一系列等同的myisam表以邏輯方式組合在一起,並作為乙個物件引用它們。merge表的優點在於可以突破對單個myisam表大小的限制,並且通過將不同的表分布在多個磁碟上,可以有效地改善merge表的訪問效率。

mysql儲存引擎 mysql儲存引擎簡介

精品推薦 什麼是儲存引擎 mysql儲存引擎是資料庫如何儲存資料 怎樣建立索引以及如何查詢更新資料等技術的實現方法,資料通過使用不同的技術儲存在檔案中,使用不同的儲存機制 索引方式來提供不同的功能。在mysql這種關係型資料中心來說,資料是以表的方式來儲存的,因此,簡單點來說,儲存引擎就是儲存和操作...

mysql個儲存引擎 MySQL儲存引擎

mysql資料庫的體系架構如下圖所示 從上圖中可以看出,mysql主要分為以下幾個元件 連線池元件 管理服務和工具元件 sql介面元件 分析器元件 優化器元件 緩衝元件 外掛程式式儲存引擎 物理檔案 儲存引擎 其實就是指定表如何儲存資料,如何為儲存的資料建立索引以及如何更新 查詢資料等技術實現的方法...

mysql儲存引擎模式 mysql儲存引擎

mysql資料庫的體系架構如下圖所示 從上圖中可以看出,mysql主要分為以下幾個元件 連線池元件 管理服務和工具元件 sql介面元件 分析器元件 優化器元件 緩衝元件 外掛程式式儲存引擎 物理檔案 一 儲存引擎 儲存引擎 其實就是指定 表 如何儲存資料,如何為儲存的資料 建立索引以及 如何更新,查...