程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺陷剖析

淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺陷剖析

編輯:MySQL綜合教程

淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺陷剖析。本站提示廣大學習愛好者:(淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優缺陷剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談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的機能優勢。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved