數據庫引擎介紹php
MySQL數據庫引擎取決於MySQL在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須從新編譯MYSQL。在缺省狀況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也經常可使用。若是技術高超,還可使用MySQL+API本身作一個引擎。下面介紹幾種數據庫引擎:html
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+API來建立本身的數據庫引擎。這個API爲你提供了操做字段、記錄、表格、數據庫、鏈接、安全賬號的功能,以及創建諸如MySQL這樣DBMS所須要的全部其餘無數功能。深刻講解API已經超出了本文的範圍,可是你須要瞭解MySQL+API的存在及其可交換引擎背後的技術,這一點是很重要的。估計這個插件式數據庫引擎的模型甚至可以被用來爲MySQL建立本地的XML提供器(XML provider)。(任何讀到本文的MySQL+API開發人員能夠把這一點看成是個要求。)
MyISAM與InnoDB的區別
InnoDB和MyISAM是許多人在使用MySQL時最經常使用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差異爲:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,可是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。mysql
如下是一些細節和具體實現的差異:
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) fromtable時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含where條件時,兩種表的操做是同樣的。
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
5.LOAD TABLE FROMMASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。sql
另外,InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如updatetable set num=1 where name like 「a%」
兩種類型最主要的差異就是Innodb支持事務處理與外鍵和行級鎖.而MyISAM不支持.因此MyISAM每每就容易被人認爲只適合在小項目中使用。
我做爲使用MySQL的用戶角度出發,Innodb和MyISAM都是比較喜歡的,可是從我目前運維的數據庫平臺要達到需求:99.9%的穩定性,方便的擴展性和高可用性來講的話,MyISAM絕對是個人首選。數據庫
緣由以下:
一、首先我目前平臺上承載的大部分項目是讀多寫少的項目,而MyISAM的讀性能是比Innodb強很多的。
二、MyISAM的索引和數據是分開的,而且索引是有壓縮的,內存使用率就對應提升了很多。能加載更多索引,而Innodb是索引和數據是緊密捆綁的,沒有使用壓縮從而會形成Innodb比MyISAM體積龐大不小。
三、從平臺角度來講,常常隔1,2個月就會發生應用開發人員不當心update一個表where寫的範圍不對,致使這個表無法正經常使用了,這個時候MyISAM的優越性就體現出來了,隨便從當天拷貝的壓縮包取出對應表的文件,隨便放到一個數據庫目錄下,而後dump成sql再導回到主庫,並把對應的binlog補上。若是是Innodb,恐怕不可能有這麼快速度,別和我說讓Innodb按期用導出xxx.sql機制備份,由於我平臺上最小的一個數據庫實例的數據量基本都是幾十G大小。
四、從我接觸的應用邏輯來講,select count(*) 和order by是最頻繁的,大概能佔了整個sql總語句的60%以上的操做,而這種操做Innodb其實也是會鎖表的,不少人覺得Innodb是行級鎖,那個只是where對它主鍵是有效,非主鍵的都會鎖全表的。
五、還有就是常常有不少應用部門須要我給他們按期某些表的數據,MyISAM的話很方便,只要發給他們對應那表的frm.MYD,MYI的文件,讓他們本身在對應版本的數據庫啓動就行,而Innodb就須要導出xxx.sql了,由於光給別人文件,受字典數據文件的影響,對方是沒法使用的。
六、若是和MyISAM比insert寫操做的話,Innodb還達不到MyISAM的寫性能,若是是針對基於索引的update操做,雖然MyISAM可能會遜色Innodb,可是那麼高併發的寫,從庫可否追的上也是一個問題,還不如經過多實例分庫分表架構來解決。
七、若是是用MyISAM的話,merge引擎能夠大大加快應用部門的開發速度,他們只要對這個merge表作一些selectcount(*)操做,很是適合大項目總量約幾億的rows某一類型(如日誌,調查統計)的業務表。
固然Innodb也不是絕對不用,用事務的項目如模擬炒股項目,我就是用Innodb的,活躍用戶20多萬時候,也是很輕鬆應付了,所以我我的也是很喜歡Innodb的,只是若是從數據庫平臺應用出發,我仍是會首MyISAM。
另外,可能有人會說你MyISAM沒法抗太多寫操做,可是我能夠經過架構來彌補,說個我現有用的數據庫平臺容量:主從數據總量在幾百T以上,天天十多億pv的動態頁面,還有幾個大項目是經過數據接口方式調用未算進pv總數,(其中包括一個大項目由於初期memcached沒部署,致使單臺數據庫天天處理9千萬的查詢)。而個人總體數據庫服務器平均負載都在0.5-1左右。ubuntu
通常來講,MyISAM適合:
(1)作不少count 的計算;
(2)插入不頻繁,查詢很是頻繁;
(3)沒有事務。緩存
InnoDB適合:
(1)可靠性要求比較高,或者要求事務;
(2)表更新和查詢都至關的頻繁,而且表鎖定的機會比較大的狀況指定數據引擎的建立
讓全部的靈活性成爲可能的開關是提供給ANSI SQL的MySQL擴展——TYPE參數。MySQL可以讓你在表格這一層指定數據庫引擎,因此它們有時候也指的是table formats。下面的示例代碼代表瞭如何建立分別使用MyISAM、ISAM和HEAP引擎的表格。要注意,建立每一個表格的代碼是相同的,除了最後的 TYPE參數,這一參數用來指定數據引擎。安全
如下爲引用的內容:
性能優化
你也可使用ALTER TABLE命令,把原有的表格從一個引擎移動到另外一個引擎。下面的代碼顯示瞭如何使用ALTER TABLE把MyISAM表格移動到InnoDB的引擎:服務器
如下爲引用的內容:
MySQL用三步來實現這一目的。首先,這個表格的一個副本被建立。而後,任何輸入數據的改變都被排入隊列,同時這個副本被移動到另外一個引擎。最後,任何排入隊列的數據改變都被送交到新的表格裏,而原來的表格被刪除。
若是隻是想把表格從ISAM更新爲MyISAM,你可使用MySQL_convert_table_format命令,而不須要編寫ALTER TABLE表達式。
你可使用SHOW TABLE命令(這是MySQL對ANSI標準的另外一個擴展)來肯定哪一個引擎在管理着特定的表格。SHOW TABLE會返回一個帶有多數據列的結果集,你能夠用這個結果集來查詢得到全部類型的信息:數據庫引擎的名稱在Type字段裏。下面的示例代碼說明了 SHOW TABLE的用法:
你能夠用SHOW CREATE TABLE [TableName]來取回SHOW TABLE可以取回的信息。
通常狀況下,MySQL會默認提供多種存儲引擎,能夠經過下面的查看:
(1)看你的MySQL如今已提供什麼存儲引擎: mysql> show engines;
(2)看你的MySQL當前默認的存儲引擎: mysql> show variables like '%storage_engine%';
(3)你要看某個表用了什麼引擎(在顯示結果裏參數engine後面的就表示該表當前用的存儲引擎): mysql> show create table 表名;
最後,若是你想使用沒有被編譯成MySQL也沒有被激活的引擎,那是沒有用的,MySQL不會提示這一點。而它只會給你提供一個缺省格式(MyISAM)的表格。除了使用缺省的表格格式外,還有辦法讓MySQL給出錯誤提示,可是就如今而言,若是不能確定特定的數據庫引擎是否可用的話,你要使用SHOW TABLE來檢查表格格式。
更多的選擇意味着更好的性能
用於特定表格的引擎都須要從新編譯和追蹤,考慮到這種的額外複雜性,爲何你仍是想要使用非缺省的數據庫引擎呢?答案很簡單:要調整數據庫來知足你的要求。
能夠確定的是,MyISAM的確快,可是若是你的邏輯設計須要事務處理,你就能夠自由使用支持事務處理的引擎。進一步講,因爲MySQL可以容許你在表格這一層應用數據庫引擎,因此你能夠只對須要事務處理的表格來進行性能優化,而把不須要事務處理的表格交給更加輕便的MyISAM引擎。對於 MySQL而言,靈活性纔是關鍵。
性能測試
全部的性能測試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 內存的電腦上測試。
測試方法:連續提交10個query, 表記錄總數:38萬 , 時間單位 s
引擎類型MyISAMInnoDB 性能相差
count 0.00083573.01633609
查詢主鍵 0.005708 0.157427.57
查詢非主鍵 24.01 80.37 3.348
更新主鍵 0.008124 0.8183100.7
更新非主鍵 0.004141 0.02625 6.338
插入 0.004188 0.369488.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 KB179,584 KB
其餘
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次插入/更新的.
常見的mysql表引擎有INNODB和MyISAM,主要的區別是INNODB適合頻繁寫數據庫操做,MyISAM適合讀取數據庫的狀況多一點,如何把表引擎INNODB更改成MyISAM呢?
使用如下mysql sql語句,能夠給表設定數據庫引擎:
ALTER TABLE `wp_posts` ENGINE = MyISAM;
在須要使用mysql的全文索引(FULLTEXT index)的時候,這張表的數據庫引擎必須是MyISAM類型。關於INNODB爲MyISAM數據庫引擎有什麼具體區別
例子
修改表的存儲引擎myisam<=>innodb
查看錶的存儲引擎
mysql> show create table tt7;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| tt7 | CREATE TABLE `tt7` (
`id` int(10) default NULL,
`name` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
查看錶的數據量
mysql> select count(1) from tt7;
+----------+
| count(1) |
+----------+
| 16777216 |
+----------+
1 row in set (0.00 sec)
方法一:
直接更改存儲引擎
mysql> alter table tt7 engine=innodb;
Query OK, 16777216 rows affected (2 min 39.80 sec)
Records: 16777216 Duplicates: 0 Warnings: 0
方法二:
把方法一中的存儲引擎改回myisam
mysql> alter table tt7 engine=myisam;
Query OK, 16777216 rows affected (27.09 sec)
Records: 16777216 Duplicates: 0 Warnings: 0
從這裏也能夠看出myisam表要比innodb錶快不少
建立個和tt7一樣表結構的表
mysql> create table tt7_tmp like tt7;
Query OK, 0 rows affected (0.02 sec)
tt7_tmp做爲中間結果集
mysql> insert into tt7_tmp select * from tt7;
Query OK, 16777216 rows affected (27.20 sec)
Records: 16777216 Duplicates: 0 Warnings: 0
刪除原表的數據
mysql> truncate table tt7;
Query OK, 16777725 rows affected (0.18 sec)
這回更改原表的存儲引擎
mysql> alter table tt7 engine=innodb;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
速度很快就完成了
再把中間結果集的數據導回原表中
mysql> insert into tt7 select * from tt7_tmp;
Query OK, 16777216 rows affected (2 min 0.95 sec)
Records: 16777216 Duplicates: 0 Warnings: 0
刪除中間表
mysql> drop table tt7_tmp;
測試結果:
方法二比較快一點,可是數據量要是比較大的話,方法二就要採用化整爲零的分批操做的方式,不然insert操做將會具耗時,併產生大量的undo日誌。
若是是小表的話(500M之內,根據本身系統的硬件環境),採用方法一就能夠
若是是大表的話,那就採用方法二+批量的方式
若是是批量更改表的存儲引擎
用於生成變動的SQL語句:
SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema='db_name' AND ENGINE='myisam';
用於生成檢查表的SQL語句:
SELECT CONCAT('CHECK TABLE ',table_name) FROM information_schema.tables WHERE table_schema='db_name';
根據本身系統配置修改以下參數,以加快變動速度(記得之前的值,一會還得改回來)
SET GLOBAL sort_buffer_size=64*1024*1024;
SET GLOBAL tmp_table_size=64*1024*1024;
SET GLOBAL read_buffer_size=32*1024*1024;
SET GLOBAL read_rnd_buffer_size=32*1024*1024;
MYSQL中myisam和innodb引擎的區別
MyISAM 是MySQL中默認的存儲引擎,通常來講不是有太多人關心這個東西。決定使用什麼樣的存儲引擎是一個很tricky的事情,可是仍是值咱們去研究一下,這裏的文章只考慮 MyISAM 和InnoDB這兩個,由於這兩個是最多見的。
講講你對mysql myisam和innodb的認識。而後你認爲他們的區別在那裏?爲何?
答:這兩個是MySQL主要存儲引擎。
簡要介紹來自官網。
簡要介紹:myIsam
myIdam是默認存儲引擎。它基於更老的ISAM代碼,但有不少有用的擴展。(注意MySQL5.1不支持ISAM)。
每一個myisam在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD(MYData)。索引文件的擴展名是.MYI(MYIndex)。
簡要介紹: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次插入/更新的負荷。
簡單歸納幾點以下:
1. 經過以上不難看出,myIsam InnoDB的用途,myisam主要適用於中小型數據量。InnoDB引擎適用於大數據量。上面已經講得很清楚拉。著名的開源電子商務系統[magento]就是採用InnoDB建立。
2. myIsam寫入速度比InnoDB快。
3. 在使用InnoDB時候須要對my.cnf進行配置以保證MySQL達到最大效率。詳細能夠查看官網[inndo性能調節]:
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。
其中有不少人在網上發表了關於mysql myIdam和InnoDB在存貯和讀取方面的差別。暫時尚未作過分研究。
基本測試都是基於使用[事務]和不使用[事務],進行對比。MySQL對於[非事務表]速度會比較塊。
下面先讓咱們回答一些問題:
◆你的數據庫有外鍵嗎?
◆你須要事務支持嗎?
◆你須要全文索引嗎?
◆你常用什麼樣的查詢模式?
◆你的數據有多大?
myisam只有索引緩存
innodb不分索引文件數據文件 innodb buffer
myisam只能管理索引,在索引數據大於分配的資源時,會由操做系統來cache;數據文件依賴於操做系統的cache。innodb無論是索引仍是數據,都是本身來管理
思考上面這些問題可讓你找到合適的方向,但那並非絕對的。若是你須要事務處理或是外鍵,那麼InnoDB 多是比較好的方式。若是你須要全文索引,那麼一般來講 MyISAM是好的選擇,由於這是系統內建的,然而,咱們其實並不會常常地去測試兩百萬行記錄。因此,就算是慢一點,咱們能夠經過使用Sphinx從InnoDB中得到全文索引。
數據的大小,是一個影響你選擇什麼樣存儲引擎的重要因素,大尺寸的數據集趨向於選擇InnoDB方式,由於其支持事務處理和故障恢復。數據庫的在小決定了故障恢復的時間長短,InnoDB能夠利用事務日誌進行數據恢復,這會比較快。而MyISAM可能會須要幾個小時甚至幾天來幹這些事,InnoDB只須要幾分鐘。
您操做數據庫表的習慣可能也會是一個對性能影響很大的因素。好比: COUNT() 在 MyISAM 表中會很是快,而在InnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會至關至關的快,但須要當心的是若是咱們的主鍵太長了也會致使性能問題。大批的inserts 語句在 MyISAM下會快一些,可是updates 在InnoDB 下會更快一些——尤爲在併發量大的時候。
因此,到底你檢使用哪個呢?根據經驗來看,若是是一些小型的應用或項目,那麼MyISAM 也許會更適合。固然,在大型的環境下使用 MyISAM 也會有很大成功的時候,但卻不老是這樣的。若是你正在計劃使用一個超大數據量的項目,並且須要事務處理或外鍵支持,那麼你真的應該直接使用 InnoDB方式。但須要記住InnoDB 的表須要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有很是壞的體驗。
===========================================================
MyISAM:這個是默認類型,它是基於傳統的ISAM類型,ISAM是 Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法.與其餘存儲引擎比較,MyISAM具備檢查和修復表格的大多數工具. MyISAM表格能夠被壓縮,並且它們支持全文搜索.它們不是事務安全的,並且也不支持外鍵。若是事物回滾將形成不徹底回滾,不具備原子性。若是執行大量的SELECT,MyISAM是更好的選擇。
InnoDB:這種類型是事務安全的.它與BDB類型具備相同的特性,它們還支持外鍵.InnoDB表格速度很快.具備比BDB還豐富的特性,所以若是須要一個事務安全的存儲引擎,建議使用它.若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表,
對於支持事物的InnoDB類型的標,影響速度的主要緣由是AUTOCOMMIT默認設置是打開的,並且程序沒有顯式調用BEGIN 開始事務,致使每插入一條都自動Commit,嚴重影響了速度。能夠在執行sql前調用begin,多條sql造成一個事物(即便autocommit打開也能夠),將大大提升性能。
===============================================================
InnoDB和MyISAM是在使用MySQL最經常使用的兩個表類型,各有優缺點,視具體應用而定。下面是已知的二者之間的差異,僅供參考。
innodb
InnoDB 給 MySQL 提供了具備事務(commit)、回滾(rollback)和崩潰修復能力 (crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。 InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non- locking read in SELECTs)。這些特性均提升了多用戶併發操做的性能表現。在InnoDB表中不須要擴大鎖定 (lock escalation),由於 InnoDB 的列鎖定(row level locks)適宜很是小的空間。 InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。
InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基於磁盤的關係數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。 InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不同,舉例來講,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操做系統的文件大小,通常爲 2 GB。
InnoDB全部的表都保存在同一個數據文件 ibdata1 中(也多是多個文件,或者是獨立的表空間文件),相對來講比較很差備份,免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump。
MyISAM
MyISAM 是MySQL缺省存貯引擎 .
每張MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。 索引文件是 MYI (MYIndex) 引申。
由於MyISAM相對簡單因此在效率上要優於InnoDB..小型應用使用MyISAM是不錯的選擇.
MyISAM表是保存成文件的形式,在跨平臺的數據轉移中使用MyISAM存儲會省去很多的麻煩
如下是一些細節和具體實現的差異:
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%」
任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優點。
===============================================================
如下是InnoDB和MyISAM的一些聯繫和區別!
1. 4.0以上mysqld都支持事務,包括非max版本。3.23的須要max版本mysqld才能支持事務。
2. 建立表時若是不指定type則默認爲myisam,不支持事務。
能夠用 show create table tablename 命令看錶的類型。
2.1 對不支持事務的表作start/commit操做沒有任何效果,在執行commit前已經提交,測試:
執行一個msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;
begin;
insert into tn values(‘a’);
insert into ty values(‘a’);
select * from tn;
select * from ty;
都能看到一條記錄
執行另外一個mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一條記錄
而後在另外一邊
commit;
才都能看到記錄。
3. 能夠執行如下命令來切換非事務表到事務(數據不會丟失),innodb表比myisam表更安全:
alter table tablename type=innodb;
3.1 innodb表不能用repair table命令和myisamchk -r table_name
但能夠用check table,以及mysqlcheck [OPTIONS] database [tables]
==============================================================
mysql中使用select for update的必須針對InnoDb,而且是在一個事務中,才能起做用。
select的條件不同,採用的是行級鎖仍是表級鎖也不同。
轉 的說明
因爲InnoDB 預設是Row-Level Lock,因此只有「明確」的指定主鍵,MySQL 纔會執行Row lock (只鎖住被選取的資料例) ,不然MySQL 將會執行Table Lock (將整個資料表單給鎖住)。
舉個例子:
假設有個表單products ,裏面有id 跟name 二個欄位,id 是主鍵。
例1: (明確指定主鍵,而且有此筆資料,row lock)
SELECT * FROM products WHERE id=’3′ FOR UPDATE;
例2: (明確指定主鍵,若查無此筆資料,無lock)
SELECT * FROM products WHERE id=’-1′ FOR UPDATE;
例2: (無主鍵,table lock)
SELECT * FROM products WHERE name=’Mouse’ FOR UPDATE;
例3: (主鍵不明確,table lock)
SELECT * FROM products WHERE id<>’3′ FOR UPDATE;
例4: (主鍵不明確,table lock)
SELECT * FROM products WHERE id LIKE ’3′ FOR UPDATE;
注1:
FOR UPDATE 僅適用於InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。
好比建立表 "test"
通常狀況這樣沒任何問題。可是,若是MySQL服務器在配置中,未啓用 InnoDB 存儲引擎。在建立表 "test" 時,MySQL會自動選擇默認的存儲引擎 MyISAM 建立。
實例演示以下:
MySQL 服務器基本狀況:
MySQL 服務器未啓用 InnoDB 存儲引擎;測試數據庫庫名: mytest ;測試數據庫表名: test ( mytest.test ) ;測試數據庫登陸賬號: root ;測試數據賬號登陸密碼: mypassword ;
列 "Engine" 下顯示的值表示表正在使用的 MySQL 存儲引擎。在未啓用 InnoDB 存儲引擎的狀況下,咱們能夠發現正確的方式返回的結果裏面,列 "Engine" 爲 "MyISAM",並非 "InnoDB" 存儲引擎。因此,使用 「SHOW CREATE TABLE 表名」 查看錶使用的 MySQL 存儲引擎是不許確的。
1. 確認 MySQL 服務器 是否啓用 InnoDB 存儲引擎
返回結果是: "InnoDB" 對應的 "Support"等於 「NO」 ,表示未啓用 InnoDB 存儲引擎。
2. 建立表 "test"
01.mysql> create database mytest;
3. 使用不許確的方式: 「SHOW CREATE TABLE 表名」 查看
4. 正確方式一: SHOW TABLE STATUS from 數據庫庫名 where Name='表名';
5. 正確方式二: mysqlshow -u 數據庫登陸賬號 -p '數據庫登陸賬號密碼' --status 數據庫庫名 表名
1 查看系統支持的存儲引擎
show engines;
2 查看錶使用的存儲引擎
兩種方法:
a、show table status from db_name where name='table_name';
b、show create table table_name;
若是顯示的格式很差看,能夠用\g代替行尾分號
有人說用第二種方法不許確,我試了下,關閉掉原先默認的Innodb引擎後根本沒法執行show create table table_name指令,由於以前建的是Innodb表,關掉後默認用MyISAM引擎,致使Innodb表數據沒法被正確讀取。
3 修改表引擎方法
alter table table_name engine=innodb;
4 關閉Innodb引擎方法
關閉mysql服務: net stop mysql
找到mysql安裝目錄下的my.ini文件:
找到default-storage-engine=INNODB 改成default-storage-engine=MYISAM
找到#skip-innodb 改成skip-innodb
啓動mysql服務:net start mysql