一 . MyISAM是 默認存儲引擎。
它基於更老的ISAM代碼,但有不少有用的擴展。(注意MySQL 5.1不支持ISAM)。
8 f' S* Q2 ^! i; Z3 Z
每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。
3 P4 v- ?- T; C+ v1 o6 R9 I
二 . InnoDB給MySQL提供 了具備提交,回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。
0 {; H3 I" D( ^: b8 e
InnoDB鎖定在行級而且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特點增長 了多用戶部署和性能。沒有在InnoDB中擴大鎖定的須要,由於在InnoDB中行級鎖定適合很是小的
空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你能夠自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也能夠混合。
G1 q, L* U( {
InnoDB是爲處理
巨大數據量時的最大性能設計。它的CPU效率多是任何其它基於磁盤的關係數據庫引擎所不能匹敵的。
. r$ O2 {, A# m. g
InnoDB存儲引擎被徹底與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池。
3 [& k, J% q: ~8 S$ h) f! A3 S; f' x7 v
e5 s! [$ w+ \! c9 K4 X
InnoDB存儲它的表&索引在一個表空間中,表空間能夠包含數個文件(或原始磁盤分區)。這與MyISAM表不一樣,好比在
) Y ]! c2 p9 o, p! U2 B; @
" s1 B- P( T- y. \& g
MyISAM表中每一個表被存在分離的文件中。InnoDB 表能夠是任何尺寸,即便在文件尺寸被限制爲2GB的操做系統上。
$ @6 C# I+ v& R' A# A- U2 D% |
InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成爲Windows上MySQL的 默認表。
InnoDB被用來在衆多須要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的負荷。
三 . 簡單歸納幾點以下:
! n4 l$ |& L1 G" O
1.經過不上不難看出,MyIsam InnoDB的用途,Myisam主要適用於
中小型數據量。InnoDB引擎適用
於大數據量。上面已經講得很清楚拉。著名的開源電子商務系統[
magento]就是採用InnoDB建立。
; ^9 w) H9 w! d4 a. k6 o0 E
2.
MyIsam寫入速度比InnoDB快。
0 @ T, n9 E+ R/ c$ S7 T/ g
3.在使用InnoDB時候須要對
my.cnf進行配置以保證mysql達到最大效率。詳細能夠查看官網[inndo性能調節]:
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-tuning。
其中有不少人在網上發表了關於mysql MyIsam 和 InnoDB在存貯和讀取方面的差別。暫時尚未作過分研究。
+ a# M5 I0 T- A' b5 r0 |% q
基本測試都是基於使用[事務]和不使用[事務],進行對比。mysql對於[非事務表]速度會比較塊。
S& N! ~9 _1 W' q
4 [+ c# n' P6 S" l! a
◆1.InnoDB不支持FULLTEXT類型的索引。
1 X, j' x% F2 j* Q
◆2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。
◆3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
3 t) [. W$ P: A! ~: F- P) P
◆4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
5 b/ j9 j8 }1 j/ O
◆5.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
1 w" w, b8 _- {5 k) x- d
另外,InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」
/ \* u6 _2 {- c( s3 {
InnoDB性能調節提示<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
若是Unix頂層工具或者Windows任務管理器顯示,你的數據庫的工做負荷的CPU使用率小於70%,則你的工做負荷多是磁盤綁定的,可能你正生成太多的事務和提交,或者緩衝池過小。使得緩衝池更大一些會有幫助的,但不要設置緩衝池等於或超過物理內存的80%.
* D5 T3 L8 O& C6 q1 s- w1 {* C
· 把數個修改裹進一個事務裏。若是事務對數據庫修改,InnoDB在該事務提交時必須刷新日誌到磁盤。由於磁盤旋轉的速度至多167轉/秒,若是磁盤沒有騙操做系統的話,這就限制提交的數目爲一樣的每秒167次。
· 若是你能夠接受損失一些最近的已提交事務,你能夠設置my.cnf文件裏的參數innodb_flush_log_at_trx_commit爲0。 不管如何InnoDB試着每秒刷新一第二天志,儘管刷新不被許可。
9 `1 j: y$ e* ^# o; _- Q: p
· 使用大的日誌文件,讓它甚至與緩衝池同樣大。當InnoDB寫滿日誌文件時,它不得不在一個檢查點把緩衝池已修改的內容寫進磁盤。小日誌文件致使許多沒必要要的吸盤寫操做。大日誌文件的缺點時恢復時間更長。
· 也讓日誌緩衝至關大(與8MB類似的數量)。
3 A* O, Z1 ?. i$ F4 c1 I
· 若是你存儲變長度字符串,或者列可能包含不少NULL值,則使用VARCHAR列類型而不是CHAR類型。一個CHAR(
N)列老是佔據
N 字節來存儲,即便字符串更短或字符串的值是NULL。越小的表越好地適合緩衝池而且減小磁盤I/O。
當使用row_format=compact (MySQL 5.1中默認的InnoDB記錄格式)和可變長度字符集,好比UTF-8或sjis,CHAR(
N)將佔據可變數量的空間,至少爲
N 字節。
· 在一些版本的GNU/Linux和Unix上,用Unix的fsync()(InnoDB默認使用的)把文件刷新到磁盤,而且其餘類似的方法是驚人的 慢。若是你不滿意數據庫的寫性能,你能夠試着設置my.cnf裏的innodb_flush_method爲O_DSYNC,雖然O_DSYNC在多數系 統上看起來更慢。
· 當在Solaris 10上,爲x86_64架構(AMD Opteron)使用InnoDB存儲引擎,重要的是使用forcedirectio選項來安裝任何爲存儲與InnoDB相關的文件而使用的數據系統。 (默認在Solaris 10/x86_64上不使用這個文件系統安裝選項)。使用forcedirectio 失敗會致使InnoDB在這個平臺上的速度和性能嚴重退化。
· 當導入數據到InnoDB中之時,請確信MySQL沒有容許autocommit模式,由於容許autocommit模式會須要每次插入都要刷新日誌到 磁盤。要在導入操做規程中禁止autocommit模式,用SET AUTOCOMMIT和COMMIT語句來包住導入語句:
· SET AUTOCOMMIT=0;· /* SQL import statements ... */· COMMIT;
6 r V5 v! v; R
若是你使用
mysqldump 選項--opt,即便不用SET AUTOCOMMIT和COMMIT語句來包裹,你也使得快速的轉儲文件被導入到InnoDB表中。
· 當心大宗插入的大回滾:InnoDB在插入中使用插入緩衝來節約磁盤I/O,可是在相應的回滾中沒有使用這樣的機制。一個磁盤綁定的回滾能夠用相應插入 花費時間的30倍來執行。殺掉數據庫進程沒有是幫助的,由於回滾在服務器啓動時會再次啓動。除掉一個失控的回滾的惟一方法是增大緩衝池使得回滾變成CPU 綁定且跑得快,或者使用專用步驟,請參閱15.2.8.1節,「強制恢復」。
· 也要當心其它大的磁盤綁定操做。用DROP TABLE或CREATE TABLE來清空一個表,而不是用DELETE FROM
tbl_name。
0 d) T. c4 B/ | U8 c& J, ]
· 若是你須要插入許多行,則使用多行插入語法來減小客戶端和服務器之間的通信開支:
/ t3 {% ]# d( K( [! z5 E
· INSERT INTO yourtable VALUES (1,2), (5,5), ...;
這個提示對到任何表類型的插入都是合法的,不只僅是對InnoDB類型。
9 |/ M4 W1 c( t
· 若是你在第二個鍵上有UNIQUE約束,你能夠在導入會話中暫時關閉惟一性檢查以加速表的導入:
· SET UNIQUE_CHECKS=0;
: S1 @8 E# ?( Q1 m" G' S- c
對於大表,這節約了大量磁盤I/O,由於InnoDB可使用它的插入緩衝來在一批內寫第二個索引記錄。
· 若是你對你的表有FOREIGN KEY約束,你能夠在導入會話過程當中經過關閉外鍵檢查來提速表的導入:
· SET FOREIGN_KEY_CHECKS=0;
4 u% H/ p3 z' n 對於大表,這能夠節約大量的磁盤I/O。 · 若是你常常有對不常常更新的表的重發查詢,請使用查詢緩存: · [mysqld]· query_cache_type = ON· query_cache_size = 10M