MySQL數據庫引擎ISAM MyISAM HEAP InnoDB的區別


        MySQL數據庫引擎取決於MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須重新編譯MYSQL。在缺省情況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也常常可以使用。如果技術高超,還可以使用MySQL++ API自己做一個引擎。

        ISAM:ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到 數據庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不占用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不 支持事務處理,也不能夠容錯:如果你的硬盤崩潰了,那么數據文件就無法恢復了。如果你正在把ISAM用在關鍵任務應用程序里,那就必須經常備份你所有的實 時數據,通過其復制特性,MYSQL能夠支持這樣的備份應用程序。

        MyISAM:MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個並發的讀寫操作,其代價是你需要經常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的擴展,例如用來修復數據庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK工具。MYISAM強調了快速讀取操作,這可能就是為什么MySQL受到了WEB開發如此青睞的主要原因:在WEB開發中你所進行的大量數據操作都是讀取操作。所以,大多數虛擬主機提供商和INTERNET平台提供商只允許使用MYISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞后恢復數據。

        HEAP:HEAP允許只駐留在內存里的臨時表格。駐留在內存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數據是不穩定的,而且如果在關機之前沒有進行保存,那么所有的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表達式來選擇和操控數據的時候非常有用。要記住,在用完表格之后就刪除表格。

        InnoDB:InnoDB數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL++ API。在使用MYSQL的時候,你所面對的每一個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理(transaction process)也不支持外來鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者 或者兩者,那你就要被迫使用后兩個引擎中的一個了。

        MySQL官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。

InnoDB是為處理巨大數據量時的最大性能設計,它的CPU效率可能是任何其它基於磁盤的關系數據庫引擎所不能匹敵的。

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

        InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。

        InnoDB被用來在眾多需要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的。

 

        MyISAM適用場景
                (1)做很多count 的計算;
                (2)插入不頻繁,查詢非常頻繁;
                (3)沒有事務。
        InnoDB適用場景
                (1)可靠性要求比較高,或者要求事務;
                (2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況。

 

        一般情況下,MySQL會默認提供多種存儲引擎,可以通過下面的查看:

                (1)看你的MySQL現在已提供什么存儲引擎: mysql> show engines;

                (2)看你的MySQL當前默認的存儲引擎: mysql> show variables like '%storage_engine%';

                (3)你要看某個表用了什么引擎(在顯示結果里參數engine后面的就表示該表當前用的存儲引擎): mysql> show create table 表名;


        所有的性能測試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 內存的電腦上測試。

        測試方法:連續提交10個query, 表記錄總數:38萬 , 時間單位 (s)

引擎類型 MyISAM                InnoDB             

性能相差

count                      0.0008357 3.0163 3609
查詢主鍵 0.005708 0.1574 27.57
查詢非主鍵 24.01 80.37 3.348
更新主鍵 0.008124 0.8183 100.7
更新非主鍵 0.004141 0.02625 6.338
插入 0.004188 0.3694 88.21

 

 

 

        (1)加了索引以后,對於MyISAM查詢可以加快:4 206.09733倍,對InnoDB查詢加快510.72921倍,同時對MyISAM更新速度減慢為原來的1/2,InnoDB的更新速度減慢為原來的1/30。要看情況決定是否要加索引,比如不查詢的log表,不要做任何的索引。

        (2)如果你的數據量是百萬級別的,並且沒有任何的事務處理,那么用MyISAM是性能最好的選擇。

        (3)InnoDB表的大小更加的大,用MyISAM可省很多的硬盤空間。

        在我們測試的這個38w的表中,表占用空間的情況如下:

引擎類型 MyISAM InnoDB
數據 53,924 KB 58,976 KB
索引 13,640 KB 21,072 KB
占用總空間 67,564 KB 80,048 KB

        另外一個176W萬記錄的表, 表占用空間的情況如下:

引擎類型 MyIsam InnorDB
數據 56,166 KB 90,736 KB
索引 67,103 KB 88,848 KB
占用總空間 123,269 KB 179,584 KB

 


注意!

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



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