MySQL - 常見的三種數據庫存儲引擎


原文: MySQL - 常見的三種數據庫存儲引擎

數據庫存儲引擎:是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。現在許多不同的數據庫管理系統都支持多種不同的數據引擎。MySQL的核心就是插件式存儲引擎。

 

查看存儲引擎:

我們可以用SHOW ENGINES; 來查詢數據庫的存儲引擎。

 

MySQL給用戶提供了許多不同的存儲引擎。在MySQL中,不需要在整個服務器中使用同一種存儲引擎,針對具體的要求,可以對每一個表使用不同的存儲引擎。Support列的值表示某種引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示該引擎為當前默認的存儲引擎。

 

我們也可以通過使用命令來查看數據庫默認使用的引擎:SHOW VARIABLES LIKE 'storage_engine';

 

 

下面來看一下其中幾種常用的引擎。

 

l InnoDB存儲引擎

 

InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),其它存儲引擎都是非事務安全表,支持行鎖定和外鍵,MySQL5.5以后默認使用InnoDB存儲引擎。

 

InnoDB主要特性

為MySQL提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在 SELECT語句中提供一個類似Oracle的非鎖定讀。這些功能增加了多用戶部署和性能。在SQL查詢中,可以自由地將InnoDB類型的表和其他MySQL的表類型混合起來,甚至在同一個查詢中也可以混合。

 

InnoDB表的自動增長列可以手工插入,但是插入的如果是空或0,則實際插入到則是自動增長后到值。可以通過"ALTER TABLE...AUTO_INCREMENT=n;"語句強制設置自動增長值的起始值,默認為1,但是該強制到默認值是保存在內存中,數據庫重啟后該值將會丟失。可以使用LAST_INSERT_ID()查詢當前線程最后插入記錄使用的值。如果一次插入多條記錄,那么返回的是第一條記錄使用的自動增長值。

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

 

MySQL支持外鍵的存儲引擎只有InnoDB,在創建外鍵的時候,父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。在創建索引的時候,可以指定在刪除、更新父表時,對子表進行的相應操作,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有關聯的情況下,父表不能更新;casecade表示父表在更新或刪除時,更新或者刪除子表對應的記錄;set null 則表示父表在更新或者刪除的時候,子表對應的字段被set null。

當某個表被其它表創建了外鍵參照,那么該表對應的索引或主鍵被禁止刪除。

可以使用set foreign_key_checks=0;臨時關閉外鍵約束,setforeign_key_checks=1;打開約束。

 

InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB將它的表和索引在一個邏輯表空間中,表空間可以包含數個文件(或原始磁盤文件)。這與MyISAM表不同,比如在MyISAM表中每個表被存放在分離的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上。

InnoDB支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每一行生成一個6字節的ROWID,並以此作為主鍵。

使用 InnoDB存儲引擎 MySQL將在數據目錄下創建一個名為 ibdata1的10MB大小的自動擴展數據文件,以及兩個名為 ib_logfile0和 ib_logfile1的5MB大小的日志文件

 

l MyISAM存儲引擎

 

MyISAM基於ISAM存儲引擎,並對其進行擴展。它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務,不支持外鍵。

 

MyISAM主要特性:

 

被大文件系統和操作系統支持。

當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合並相鄰被刪除的塊,若下一個塊被刪除,就擴展到下一塊自動完成。

每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16。

最大的鍵長度是1000字節,這也可以通過編譯來改變,對於鍵長度超過250字節的情況,一個超過1024字節的鍵將被用上。

BLOB和TEXT列可以被索引。

NULL被允許在索引的列中,這個值占每個鍵的0~1個字節。

所有數字鍵值以高字節優先被存儲以允許一個更高的索引壓縮。

每個MyISAM類型的表都有一個AUTOINCREMENT的內部列,當INSERT和UPDATE操作的時候該列被更新,同時AUTOINCREMENT列將被刷新。所以說,MyISAM類型表的AUTOINCREMENT列更新比InnoDB類型的AUTOINCREMENT更快。

數據文件和索引文件可以放置在不同的目錄,平均分配IO,獲取更快的速度。要指定數據文件和索引文件的路徑,需要在創建表的時候通過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑需要使用絕對路徑。

每個MyISAM表都有一個標志,服務器或myisamchk程序在檢查MyISAM數據表時會對這個標志進行設置。MyISAM表還有一個標志用來表明該數據表在上次使用后是不是被正常的關閉了。如果服務器以為當機或崩潰,這個標志可以用來判斷數據表是否需要檢查和修復。如果想讓這種檢查自動進行,可以在啟動服務器時使用--myisam-recover現象。這會讓服務器在每次打開一個MyISAM數據表是自動檢查數據表的標志並進行必要的修復處理。MyISAM類型的表可能會損壞,可以使用CHECK TABLE語句來檢查MyISAM表的健康,並用REPAIR TABLE語句修復一個損壞到MyISAM表。

每個字符列可以有不同的字符集。

有VARCHAR的表可以固定或動態記錄長度。

VARCHAR和CHAR列可以多達64KB。

使用MyISAM引擎創建數據庫,將產生3個文件。文件的名字以表名字開始,擴展名之處文件類型:frm文件存儲表定義、數據文件的擴展名為.MYD(MYData)、索引文件的擴展名時.MYI(MYIndex)。

 

MyISAM的表支持3種不同的存儲格式:靜態(固定長度)表,動態表,壓縮表

 

 靜態表是默認的存儲格式。靜態表中的字段都是非變長字段,這樣每個記錄都是固定長度的,這種存儲方式的優點是存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表在數據存儲時會根據列定義的寬度定義補足空格,但是在訪問的時候並不會得到這些空格,這些空格在返回給應用之前已經去掉。同時需要注意:在某些情況下可能需要返回字段后的空格,而使用這種格式時后面到空格會被自動處理掉。

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

壓縮表由myisamchk工具創建,占據非常小的空間,因為每條記錄都是被單獨壓縮的,所以只有非常小的訪問開支。

 

l MEMORY存儲引擎

 

MEMORY存儲引擎將表中的數據存儲到內存中,為查詢和引用其他表數據提供快速訪問。

 

MEMORY主要特性:

MEMORY表的每個表可以有多達32個索引,每個索引16列,以及500字節的最大鍵長度。

可以在一個MEMORY表中有非唯一鍵值。

MEMORY支持AUTO_INCREMENT列和對可包含NULL值的列的索引。

MEMORY表在所由客戶端之間共享(就像其他任何非TEMPORARY表)。

MEMORY表內存被存儲在內存中,內存是MEMORY表和服務器在查詢處理時的空閑中,創建的內部表共享。

默認情況下,MEMORY數據表使用散列索引,利用這種索引進行“相等比較”非常快,但是對“范圍比較”的速度就慢多了。因此,散列索引值適合使用在"="和"<=>"的操作符中,不適合使用在"<"或">"操作符中,也同樣不適合用在order by字句里。如果確實要使用"<"或">"或betwen操作符,可以使用btree索引來加快速度。

存儲在MEMORY數據表里的數據行使用的是固定長度的格式,因此加快處理速度,這意味着不能使用BLOB和TEXT這樣的長度可變的數據類型。VARCHAR是一種長度可變的類型,但因為它在MySQL內部當作長度固定不變的CHAR類型,所以也可以使用。

 

create table tab_memoryengine=memory select id,name,age,addr from man order by id;

 

使用USING HASH/BTREE來指定特定到索引。

create index mem_hash using hashon tab_memory(city_id);

 

在啟動MySQL服務的時候使用--init-file選項,把insert into...select或load data infile 這樣的語句放入到這個文件中,就可以在服務啟動時從持久穩固的數據源中裝載表。

每個MEMORY表中放置到數據量的大小,受到max_heap_table_size系統變量的約束,這個系統變量的初始值是16M,同時在創建MEMORY表時可以使用MAX_ROWS子句來指定表中的最大行數。

每個MEMORY表實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問非常快,因為它到數據是放在內存中的,並且默認使用HASH索引,但是一旦服務器關閉,表中的數據就會丟失,但表還會繼續存在。 服務器需要足夠的內存來維持所在的在同一時間使用的MEMORY表,當不再需要MEMORY表的內容時,要釋放被MEMORY表使用的內存,應該執行 DELETE FROM或 TRUNCATE TABLE,或者刪除整個表(使用DROP TABLE)。

 

l 存儲引擎的選擇

 

在實際工作中,選擇一個合適的存儲引擎是一個比較復雜的問題。每種存儲引擎都有自己的優缺點,不能籠統地說誰比誰好。

 

存儲引擎的對比

特性

InnoDB

MyISAM

MEMORY

事務安全

支持

存儲限制

64TB

空間使用

內存使用

插入數據的速度

對外鍵的支持

支持

 

 

InnoDB: 支持事務處理,支持外鍵,支持崩潰修復能力和並發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現並發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB,因為支持事務的提交(commit)和回滾(rollback)。

 

MyISAM: 插入數據快,空間和內存使用比較低。如果表主要是用於插入新記錄和讀出記錄,那么選擇MyISAM能實現處理高效率。如果應用的完整性、並發性要求比較低,也可以使用。

 

MEMORY: 所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對數據的安全性要求較低,可以選擇MEMOEY。它對表的大小有要求,不能建立太大的表。所以,這類數據庫只使用在相對較小的數據庫表。

 

同一個數據庫也可以使用多種存儲引擎的表。如果一個表要求比較高的事務處理,可以選擇InnoDB。這個數據庫中可以將查詢要求比較高的表選擇MyISAM存儲。如果該數據庫需要一個用於查詢的臨時表,可以選擇MEMORY存儲引擎。

 

若要修改默認引擎,可以修改配置文件中的default-storage-engine。可以通過:show variables like 'default_storage_engine';查看當前數據庫到默認引擎。命令:show engines和show variables like 'have%'可以列出當前數據庫所支持到引擎。其中Value顯示為disabled的記錄表示數據庫支持此引擎,而在數據庫啟動時被禁用。在MySQL5.1以后,INFORMATION_SCHEMA數據庫中存在一個ENGINES的表,它提供的信息與show engines;語句完全一樣,可以使用下面語句來查詢哪些存儲引擎支持事物處理:select engine from information_chema.engines where transactions ='yes';

可以通過engine關鍵字在創建或修改數據庫時指定所使用到引擎。

在創建表的時候通過engine=...或type=...來指定所要使用的引擎。show table status from DBname來查看指定表的引擎。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com