《Mysql必讀淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺點分析》要點:
本文介紹了Mysql必讀淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺點分析,希望對您有用。如果有疑問,可以聯系我們。
下面先讓我們回答一些問題:
◆你的數據庫有外鍵嗎?
◆你需要事務支持嗎?
◆你需要全文索引嗎?
◆你經常使用什么樣的查詢模式?
◆你的數據有多大?
思考上面這些問題可以讓你找到合適的方向,但那并不是絕對的.如果你需要事務處理或是外鍵,那么InnoDB 可能是比較好的方式.如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因為這是系統內建的,然而,我們其實并不會經常地去測試兩百萬行記錄.所以,就算是慢一點,我們可以通過使用Sphinx從InnoDB中獲得全文索引.
數據的大小,是一個影響你選擇什么樣存儲引擎的重要因素,大尺寸的數據集趨向于選擇InnoDB方式,因為其支持事務處理和故障恢復.數據庫的在小決定了故障恢復的時間長短,InnoDB可以利用事務日志進行數據恢復,這會比較快.而MyISAM可能會需要幾個小時甚至幾天來干這些事,InnoDB只需要幾分鐘.
您操作數據庫表的習慣可能也會是一個對性能影響很大的因素.比如: COUNT() 在 MyISAM 表中會非常快,而在InnoDB 表下可能會很痛苦.而主鍵查詢則在InnoDB下會相當相當的快,但需要小心的是如果我們的主鍵太長了也會導致性能問題.大批的inserts 語句在MyISAM下會快一些,但是updates 在InnoDB 下會更快一些――尤其在并發量大的時候.
所以,到底你檢使用哪一個呢?根據經驗來看,如果是一些小型的應用或項目,那么MyISAM 也許會更適合.當然,在大型的環境下使用MyISAM 也會有很大成功的時候,但卻不總是這樣的.如果你正在計劃使用一個超大數據量的項目,而且需要事務處理或外鍵支持,那么你真的應該直接使用InnoDB方式.但需要記住InnoDB 的表需要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗.
MyISAM存儲引擎 MyISAM是 默認存儲引擎.它基于更老的ISAM代碼,但有很多有用的擴展.MyISAM存儲引擎的一些特征:
●所有數據值先存儲低字節.這使得數據機和操作系統分離.二進制輕便性的唯一要求是機器使用補碼(如最近20年的機器有的一樣)和IEEE浮點格式(在主流機器中也完全是主導的).唯一不支持二進制兼容性的機器是嵌入式系統.這些系統有時使用特殊的處理器.
●先存儲數據低字節并不嚴重地影響速度;數據行中的字節一般是未聯合的,從一個方向讀未聯合的字節并不比從反向讀更占用更多的資源.服務器上的獲取列值的代碼與其它代碼相比并不顯得時間緊.
●大文件(達63位文件長度)在支持大文件的文件系統和操作系統上被支持.
●當把刪除和更新及插入混合的時候,動態尺寸的行更少碎片.這要通過合并相鄰被刪除的塊,以及若下一個塊被刪除,就擴展到下一塊來自動完成.
●每個MyISAM表最大索引數是64. 這可以通過重新編譯來改變.每個索引最大的列數是16個.
●最大的鍵長度是1000字節.這也可以通過編譯來改變.對于鍵長度超過250字節的情況,一個超過1024字節的的鍵塊被用上.
●BLOB和TEXT列可以被索引.
●NULL值被允許在索引的列中.這個占每個鍵的0-1個字節.
●所有數字鍵值以高字節為先被存儲以允許一個更高地索引壓縮.
●當記錄以排好序的順序插入(就像你使用一個AUTO_INCREMENT列之時),索引樹被劈開以便高節點僅包含一個鍵.這改善了索引樹的空間利用率.
●每表一個AUTO_INCREMEN列的內部處理.MyISAM為INSERT和UPDATE操作自動更新這一 列.這使得AUTO_INCREMENT列更快(至少10%).在序列頂的值被刪除之后就不能再利用.(當AUTO_INCREMENT列被定義為多列索 引的最后一列,可以出現重使用從序列頂部刪除的值的情況 ).AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置.
●如果數據文件中間的表沒有自由塊了,在其它線程從表讀的同時,你可以INSERT新行到表中.(這被認識為并發操作 ).自由塊的出現是作為刪除行的結果,或者是用比當前內容多的數據對動態長度行更新的結果.當所有自由塊被用完(填滿),未來的插入又變成并發.
●你可以把數據文件和索引文件放在不同目錄,用DATA DIRECTORY和INDEX DIRECTORY選項CREATE TABLE以獲得更高的速度,請參閱13.1.5節,“CREATE TABLE語法”.
●每個字符列可以又不同的字符集.
●在MyISAM索引文件里又一個標志,它表明表是否被正確關閉.如果用--myisam-recover選項啟動mysqld,MyISAM表在打開得時候被自動檢查,如果被表被不恰當地關閉,就修復表.
●如果你用--update-state選項運行myisamchk,它標注表為已檢查.myisamchk --fast只檢查那些沒有這個標志的表.
●myisamchk --analyze為部分鍵存儲統計信息,也為整個鍵存儲統計信息.
●myisampack可以打包BLOB和VARCHAR列.
MyISAM也支持下列特征:
●支持true VARCHAR類型;VARCHAR列以存儲在2個字節中的長度來開始.
●有VARCHAR的表可以有固定或動態記錄長度.
●VARCHAR和CHAR列可以多達64KB.
●一個被搞亂的已計算索引對可對UNIQUE來使用.這允許你在表內任何列的合并上有UNIQUE.(盡管如此,你不能在一個UNIQUE已計算索引上搜索).
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次插入/更新的負荷.
InnoDB和MyISAM的區別
區別概述:
MyISAM 是MySQL中默認的存儲引擎,一般來說不是有太多人關心這個東西.決定使用什么樣的存儲引擎是一個很tricky的事情,但是還是值我們去研究一下,這里的文章只考慮 MyISAM 和InnoDB這兩個,因為這兩個是最常見的.
下面先讓我們回答一些問題:
你的數據庫有外鍵嗎?
你需要事務支持嗎?
你需要全文索引嗎?
你經常使用什么樣的查詢模式?
你的數據有多大?
思考上面這些問題可以讓你找到合適的方向,但那并不是絕對的.如果你需要事務處理或是外鍵,那么InnoDB 可能是比較好的方式.如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因為這是系統內建的,然而,我們其實并不會經常地去測試兩百萬行記錄.所以,就算是慢一點,我們可以通過使用Sphinx從 InnoDB中獲得全文索引.
數據的大小,是一個影響你選擇什么樣存儲引擎的重要因素,大尺寸的數據集趨向于選擇InnoDB方式,因為其支持事務處理和故障恢復.數據庫的在小 決定了故障恢復的時間長短,InnoDB可以利用事務日志進行數據恢復,這會比較快.而MyISAM可能會需要幾個小時甚至幾天來干這些事,InnoDB 只需要幾分鐘.
您操作數據庫表的習慣可能也會是一個對性能影響很大的因素.比如: COUNT() 在 MyISAM 表中會非常快,而在InnoDB 表下可能會很痛苦.而主鍵查詢則在InnoDB下會相當相當的快,但需要小心的是如果我們的主鍵太長了也會導致性能問題.大批的inserts 語句在MyISAM下會快一些,但是updates 在InnoDB 下會更快一些――尤其在并發量大的時候.
所以,到底你檢使用哪一個呢?根據經驗來看,如果是一些小型的應用或項目,那么MyISAM 也許會更適合.當然,在大型的環境下使用MyISAM 也會有很大成功的時候,但卻不總是這樣的.如果你正在計劃使用一個超大數據量的項目,而且需要事務處理或外鍵支持,那么你真的應該直接使用InnoDB方 式.但需要記住InnoDB 的表需要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗.
區別總結:
1.InnoDB不支持FULLTEXT類型的索引.
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可.注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的.
3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引.
4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除.
5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用.
另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”
提升InnoDB性能的方法:
MyISAM和InnoDB存儲引擎性能差別并不是很大,針對InnoDB來說,影響性能的主要是 innodb_flush_log_at_trx_commit 這個選項,如果設置為1的話,那么每次插入數據的時候都會自動提交,導致性能急劇下降,應該是跟刷新日志有關系,設置為0效率能夠看到明顯提升,當然,同 樣你可以SQL中提交“SET AUTOCOMMIT = 0”來設置達到好的性能.另外,還聽說通過設置innodb_buffer_pool_size能夠提升InnoDB的性能,但是我測試發現沒有特別明顯 的提升.
基本上我們可以考慮使用InnoDB來替代我們的MyISAM引擎了,因為InnoDB自身很多良好的特點,比如事務支持、存儲 過程、視圖、行級鎖定等等,在并發很多的情況下,相信InnoDB的表現肯定要比MyISAM強很多,當然,相應的在my.cnf中的配置也是比較關鍵 的,良好的配置,能夠有效的加速你的應用.
任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優勢.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2685.html