當前位置:編程學習大全網 - 源碼下載 - [轉帖]mysql常用存儲引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介紹與如何選擇

[轉帖]mysql常用存儲引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介紹與如何選擇

blog.csdn.net/CSDN___LYY/article/details/80844606

壹:前言

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

什麽是存儲引擎?

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每壹種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,妳能夠獲得額外的速度或者功能,從而改善妳的應用的整體功能。

例如,如果妳在研究大量的臨時數據,妳也許需要使用內存MySQL存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,妳也許需要壹個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

這些不同的技術以及配套的相關功能在 MySQL中被稱作存儲引擎(也稱作表類型)。 MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啟用。妳可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲妳的信息、如何檢索這些信息以及妳需要妳的數據結合什麽性能和功能的時候為妳提供最大的靈活性。

二:存儲引擎查看相關

-- 查看數據庫支持的存儲引擎

show engines;得到的結果為下圖(Support列的值表示某種引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示該引擎為當前默認的存儲引擎 。):

-- 查看mysql數據庫默認引擎

show variables like ‘%storage_engine%‘;得到結果為下圖,可以看到我的mysql數據庫默認使用的是InnoDB存儲引擎:

-- 查看表創建語句,可以獲得表的創建信息,引擎、默認字符、約束等

show create table zd_grade; 執行上面語句獲得該表的默認數據:

CREATE TABLE `zd_grade` ( `ID` char(8) NOT NULL DEFAULT ‘‘ COMMENT ‘學號‘, `Course_ID` char(8) NOT NULL DEFAULT ‘‘ COMMENT ‘課程號‘, `C_Grade` decimal(10,2) NOT NULL DEFAULT ‘0.00‘ COMMENT ‘中方分數‘, `F_Grade` decimal(10,2) NOT NULL DEFAULT ‘0.00‘ COMMENT ‘外方分數‘, `Exam_Time` date NOT NULL DEFAULT ‘0000-00-00‘ COMMENT ‘考試日期‘, `Semister` varchar(255) NOT NULL DEFAULT ‘‘ COMMENT ‘學期‘, `Grade_Type` char(2) NOT NULL DEFAULT ‘‘ COMMENT ‘成績類型‘, PRIMARY KEY (`ID`,`Course_ID`,`Grade_Type`), KEY `index_grade_id` (`ID`) USING HASH) ENGINE=InnoDB DEFAULT CHARSET=utf8 在MySQL中,不需要在整個服務器中使用同壹種存儲引擎,針對具體的要求,可以對每壹個表使用不同的存儲引擎。下面來看壹下其中幾種常用的引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)。

三:幾種常用的引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)

InnoDB存儲引擎

InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,上圖也看到了,InnoDB是默認的MySQL引擎。

InnoDB 采用MVCC(多版本並發控制)來支持高並發,並實現了四個標準的隔離級別。其默認級別是REPEATABLE READ(可重復讀),並且通過間隙鎖(next-key locking)策略防止幻讀的出現。間隙鎖是的 InnoDB 不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,以防止幻影行的插入。

InnoDB 表是基於聚簇索引建立的。InnoDB 的索引結構和 MySQL 的其他存儲引擎有很大不同,聚簇索引對主鍵查詢有很高的性能。不過它的二級索引(secondary index,非主鍵索引)中必須包含主鍵列,所以如果主鍵很大的話,其他的所有索引都會很大。因此,若表上的索引較多的話,主鍵應當盡可能的小。

InnoDB不創建目錄,使用InnoDB時,MySQL將在MySQL數據目錄下創建壹個名為ibdata1的10MB大小的自動擴展數據文件,以及兩個名為ib_logfile0和ib_logfile1的5MB大小的日誌文件。

InnoDB主要特性有:

InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在SELECT語句中提供壹個類似Oracle的非鎖定讀。這些功能增加了多用戶部署和性能。在SQL查詢中,可以自由地將InnoDB類型的表和其他MySQL的表類型混合起來,甚至在同壹個查詢中也可以混合InnoDB是為處理巨大數據量的最大性能設計。它的CPU效率可能是任何其他基於磁盤的關系型數據庫引擎鎖不能匹敵的InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB將它的表和索引在壹個邏輯表空間中,表空間可以包含數個文件(或原始磁盤文件)。這與MyISAM表不同,比如在MyISAM表中每個表被存放在分離的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上InnoDB支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每壹行生成壹個6字節的ROWID,並以此作為主鍵InnoDB被用在眾多需要高性能的大型數據庫站點上MyISAM存儲引擎

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

MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進行updata時進行表鎖,並發量相對較小。如果執行大量的SELECT,MyISAM是更好的選擇。

MyISAM的索引和數據是分開的,並且索引是有壓縮的,內存使用率就對應提高了不少。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會造成Innodb比MyISAM體積龐大。

MyISAM緩存在內存的是索引,不是數據。而InnoDB緩存在內存的是數據,相對來說,服務器內存越大,InnoDB發揮的優勢越大。

MyISAM主要特性有:

大文件(達到63位文件長度)在支持大文件的文件系統和操作系統上被支持當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合並相鄰被刪除的塊,以及若下壹個塊被刪除,就擴展到下壹塊自動完成每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16最大的鍵長度是1000字節,這也可以通過編譯來改變,對於鍵長度超過250字節的情況,壹個超過1024字節的鍵將被用上BLOB和TEXT列可以被索引NULL被允許在索引的列中,這個值占每個鍵的0~1個字節所有數字鍵值以高字節優先被存儲以允許壹個更高的索引壓縮每個MyISAM類型的表都有壹個AUTO_INCREMENT的內部列,當INSERT和UPDATE操作的時候該列被更新,同時AUTO_INCREMENT列將被刷新。所以說,MyISAM類型表的AUTO_INCREMENT列更新比InnoDB類型的AUTO_INCREMENT更快可以把數據文件和索引文件放在不同目錄每個字符列可以有不同的字符集有VARCHAR的表可以固定或動態記錄長度VARCHAR和CHAR列可以多達64KB 使用MyISAM引擎創建數據庫,將產生3個文件。文件的名字以表名字開始,擴展名之處文件類型:frm文件存儲表定義、數據文件的擴展名為.MYD(MYData)、索引文件的擴展名時.MYI(MYIndex)

MEMORY存儲引擎

使用MySQL Memory存儲引擎的出發點是速度。為得到最快的響應時間,采用的邏輯存儲介質是系統內存。雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。獲得速度的同時也帶來了壹些缺陷。它要求存儲在Memory數據表裏的數據使用的是長度不變的格式,這意味著不能使用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是壹種長度可變的類型,但因為它在MySQL內部當做長度固定不變的CHAR類型,所以可以使用。MEMORY主要特性有:

MEMORY表的每個表可以有多達32個索引,每個索引16列,以及500字節的最大鍵長度MEMORY存儲引擎執行HASH和BTREE縮影可以在壹個MEMORY表中有非唯壹鍵值MEMORY表使用壹個固定的記錄長度格式MEMORY不支持BLOB或TEXT列MEMORY支持AUTO_INCREMENT列和對可包含NULL值的列的索引MEMORY表在所由客戶端之間***享(就像其他任何非TEMPORARY表)MEMORY表內存被存儲在內存中,內存是MEMORY表和服務器在查詢處理時的空閑中,創建的內部表***享當不再需要MEMORY表的內容時,要釋放被MEMORY表使用的內存,應該執行DELETE FROM或TRUNCATE TABLE,或者刪除整個表(使用DROP TABLE)MERGE存儲引擎

MERGE存儲引擎是壹組MyISAM表的組合,這些MyISAM表結構必須完全相同,盡管其使用不如其它引擎突出,但是在某些情況下非常有用。說白了,Merge表就是幾個相同MyISAM表的聚合器;Merge表中並沒有數據,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行操作。

主要應用於服務器日誌這種信息,壹般常用的存儲策略是將數據分成很多表,每個名稱與特定的時間端相關。例如:可以用12個相同的表來存儲服務器日誌數據,每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的數據來生成報表,這意味著需要編寫並更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現錯誤的查詢,不如將這些表合並起來使用壹條查詢,之後再刪除Merge表,而不影響原來的數據,刪除Merge表只是刪除Merge表的定義,對內部的表沒有任何影響。

例如:設妳有幾個日誌數據表,他們內容分別是這幾年來每壹年的日誌記錄項,他們的定義都是下面這樣,YY代表年份:

CREATE TABLE log_YY( dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX (dt)) ENGINE = MyISAM; 假設日誌數據表的當前集合包括 log_2004、log_2005、log_2006、log_2007 ,而妳可以創建壹個如下所示的MERGE數據表把他們歸攏為壹個邏輯單元:

CREATE TABLE log_merge( dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007);ENGINE選項的值必須是MERGE,UNION選項列出了將被收錄在這個MERGE數據表離得各有關數據表。把這個MERGE創建出來後,就可以像對待任何其他數據表那樣查詢它,只是每壹次查詢都將同時作用與構成它的每壹個成員數據表 。

下面這個查詢可以讓我們知道上述幾個日誌數據表的數據行的總數:

SELECT COUNT(*) FROM log_merge;下面這個查詢用來確定在這幾年裏每年各有多少日誌記錄項:

SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y; 除了便於同時引用多個數據表而無需發出多條查詢,MERGE數據表還提供了以下壹些便利。

MERGE數據表可以用來創建壹個尺寸超過各個MyISAM數據表所允許的最大長度邏輯單元

妳看壹把經過壓縮的數據表包括到MERGE數據表裏。比如說,在某壹年結束之後,妳應該不會再往相應的日誌文件裏添加記錄,所以妳可以用myisampack工具壓縮它以節省空間,而MERGE數據表仍可以像往常那樣工作

MERGE數據表也支持DELETE 和UPDATE操作。INSERT操作比較麻煩,因為MySQL需要知道應該把新數據行插入到哪壹個成員表裏去。在MERGE數據表的定義裏可以包括壹個INSERT_METHOD選項,這個選項的可取值是NO、FIRST、LAST,他們的含義依次是INSERT操作是被禁止的、新數據行將被插入到現在UNION選項裏列出的第壹個數據表或最後壹個數據表。比如說,以下定義將對log_merge數據表的INSERT操作被當作對log_2007數據表----它是UNION選項所列出的最後壹個數據表:

CREATE TABLE log_merge( dt DATETIME NOT NULL, info VARCHAR(100) NOT NULL, INDEX(dt)) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007) INSERT_METHOD = LAST; 創建壹個新的成員數據表log_2009並讓他有同樣的表結構,然後修改log_merge數據表把log_2009包括進來:

log_2009:

CREATE TABLE log_2009 LIKE log_2008; ALTER TABLE log_merge UNION = (log_2004, log_2005, log_2006, log_2007,log_2008,log_2009);ARCHIVE存儲引擎

Archive是歸檔的意思,在歸檔之後很多的高級功能就不再支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。

四:存儲引擎的選擇

不同的存儲引擎都有各自的特點,以適應不同的需求,如下表所示:

功 能

如果要提供提交、回滾、崩潰恢復能力的事物安全(ACID兼容)能力,並要求實現並發控制,InnoDB是壹個好的選擇。如果數據表主要用來插入和查詢記錄,則MyISAM引擎能提供較高的處理效率。並且,如果妳的應用程序對查詢性能要求較高,就要使用MYISAM了。MYISAM索引和數據是分開的,而且其索引是壓縮的,可以更好地利用內存。所以它的查詢性能明顯優於INNODB。壓縮後的索引也能節約壹些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優化LIKE查詢的效率。如果只有INSERT和SELECT操作,可以選擇Archive,Archive支持高並發的插入操作,但是本身不是事務安全的。Archive非常適合存儲歸檔數據,如記錄日誌信息可以使用Archive。對日誌的壹些綜合操作,通常使用的是MERGE存儲引擎。壹般在以下幾種情況下使用Memory存儲引擎: 1)目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。

2)如果數據是臨時的,而且要求必須立即可用,那麽就可以存放在內存表中。

3)存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。

4)如果只是臨時存放數據,數據量不大,並且不需要較高的數據安全性,可以選擇將數據保存在內存中的Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。

五:總結

在對數據庫進行設計時,使用哪壹種引擎需要靈活選擇,壹個數據庫中不同表可以使用不同引擎以滿足各種性能和實際需求,使用合適的存儲引擎,將會大大提高整個數據庫的性能。

參考博客:blogs.com/wcwen1990/p/6655416.html版權聲明:本文為CSDN博主「web洋仔」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:/CSDN___LYY/article/details/80844606

[轉帖]mysql常用存儲引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介紹與如何選擇

標簽:成員數據格式幻讀treelike主鍵全文搜索arc

  • 上一篇:3G智能手機和智能手機有什麽區別?
  • 下一篇:求單機小遊戲,搞笑,休閑
  • copyright 2024編程學習大全網