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來查看指定表的引擎。

相關文章
相關標籤/搜索