為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3857808.html
1 存儲引擎概述
存儲引擎就是存儲數據,建立索引,更新查詢數據等等技術的實現方式。
存儲引擎是基於表的,而不是基於庫的。所以存儲引擎也可被稱為表類型。
Oracle,SqlServer等數據庫只有一種存儲引擎。MySQL提供了插件式的存儲引擎架構。所以MySQL存在多種存儲引擎,可以根據需要使用相應引擎,或者編寫存儲引擎。
查詢MySQL系統中支持的存儲引擎
使用MySQL客戶端命令,顯示當前MySQL系統所支持的數據庫引擎。
命令:show engines;
查看當前默認使用的存儲引擎
命令:show variables like 'table_type';
1.1 InnoDB
從MySQL5.5.8,InnoDB成為MySQL默認的存儲引擎。MySQL從3.23.34a開始支持InnoDB。
InnoDB支持事務,主要面向OLTP數據庫應用。支持行鎖,支持外鍵,並支持類似於Oracle的行鎖定讀,即默認讀取操作不會產生鎖。
InnoDB存儲引擎中支持自動增長列AUTO_INCREMENT。自動增長列的值不能為空,且值必須唯一,且必須為主鍵。在執行插入操作時,若不指定自動增長列的值,或自動增長列的值為0或NULL,則插入的值為自動增長后的值。
若插入任意值,該值在該列中沒有出現過,則可以直接插入。
InnoDB存儲引擎中,創建的表的結構存儲於.frm文件中。數據和索引存儲在innodb_data_home和innodb_data_path表空間中。
對於表的數據存儲,InnoDB存儲引擎采用了聚集的方式,每張表的存儲都是按主鍵順序進行存放。若沒有顯示地在表定義時指定主鍵,InnoDB會為每一行生成一個6字節的ROWID,並以此作為主鍵。
InnoDB支持外鍵。外鍵所在的表為子表,外鍵依賴的表為父表。父表中被主表外鍵支持的字段必須為主鍵。當刪除、更新浮標的某條信息時,子表也必須有相應的改變。
InnoDB通過多版本並發控制(MVCC)來獲得高並發性,並實現了SQL標准的4種隔離機制,默認為REPEATABLE級別。同時使用一種被稱為next-key locking的策略來避免幻讀。InnoDB還提供了插入緩沖、二次寫、自適應哈希索引、預讀等高性能和高可用的功能。
1.2 MyISAM
MySQL5.5.8之前MyISAM是MySQL默認的存儲引擎。
MyISAM不支持事務,不支持外鍵,支持全文索引,處理速度快。主要面向OLAP數據庫應用。
MyISAM存儲引擎的表存儲成3個文件,文件名與表名相同,擴展名分別為:frm,MYD,MYI。
- frm文件:存儲表的結構。
- myd文件:存儲數據。
- myi文件:存儲存儲索引。
MySQL 5.0版本之前,MyISAM默認支持的表大小為4GB,若需要支持大於4GB的MyISAM表時,則需要指定MAX_ROWS和AVG_ROW_LENGTH屬性。從MySQL5.0開始,MyISAM默認支持256T的單表數據。
MyISAM的緩沖池只緩存索引文件,而不緩存數據文件。數據文件的緩存交給操作系統完成。這與大多數使用LRU算法緩存數據的數據庫都不同。在MySQL5.1.23之前,無論32位系統或64位系統,緩存最大只能設置為4GB,在之后的版本中,64位的系統可以支持大於4GB的索引緩沖區。
1.3 MEMORY
MEMORY存儲引擎(之前被稱為HEAP存儲引擎)將表中的數據存儲在內存中。表結構以文件存儲於磁盤。文件名與表名相同,后綴名為frm。服務器需要有足夠的內存來維持MEMORY存儲引擎的表的使用。如果不需要使用了,可以釋放這些內容,或刪除不需要的表。
MEMORY存儲引擎默認使用哈希索引,可以按需求指定索引類型。
只支持表鎖,並發性能較差。不支持VARCHAR、BLOB和TEXT的列類型。
MEMORY存儲引擎通常很少用到。由於基於內存,所以響應速度非常快。但若內存出現異常就會影響到數據的完整性。若重啟機器或者關機,或當mysqld守護進程崩潰時,所有的MEMORY數據都會丟失。
MEMORY表的大小主要取決於兩個參數,分別是max_rows和max_heap_table_size:
- max_rows可以在創建表時指定;
- max_heap_table_size的大小默認為16MB,可以按需要進行擴大。
若數據超過了設置的值,則MySQL數據庫會把其轉換到MyISAM存儲引擎表,存放在磁盤中。這導致訪問性能的降低。
當數據有如下情況時,可以考慮使用MEMORY表:
- 臨時的數據:目標數據只是臨時需要,在其生命周期中必須立即可用。
- 相對無關的數據:存儲在MEMORY表中的數據如果突然丟失,不會對應用服務產生實質的負面影響,而且不會對數據完整性有長期影響。
如果使用MySQL4.1及以之前版本,MEMORY的搜索比MyISAM表的搜索效果要低,因為MEMORY表只支持哈希索引,這需要使用整個鍵進行搜索。但是,4.1之后的版本同時支持散列索引和B樹索引。B樹索可以使用部分查詢和通配查詢,也可以使用 < 、> 和 >= 等操作符。
1.4 NDB
NDB存儲引擎是一個集群存儲以前那個,類似於Oracle的RAC集群。
NDB的特點是主鍵查找速度極快,並通過添加NDB數據存儲節點可以線性的提交數據庫性能,是高可用,高性能的集群系統。
NDB存儲引擎有一個問題,即其查詢連接操作是在數據庫層完成的,而不是存儲引擎完成的。這意味着,復雜的連接操作需要巨大的網絡開銷,因此返回擦洗速度很慢。
1.5 Archive
Archive存儲引擎只支持INSERT和SELECT操作,從MySQL5.1開始支持索引。
Archive存儲引擎使用zlib算法將數據和進行壓縮后存儲,壓縮比可達1:10。Archive存儲引擎非常適合存儲歸檔數據。Archive使用行鎖啊來實現高並發的插入操作,但不支持事務。
1.6 Federated
Federated存儲引擎不存放數據,只是指向一台遠程MySQL數據庫服務器上的表。
1.7 Maria
Maria存儲引擎是新開發的引擎,用於取代原有的MyISAM。支持緩存數據和索引文件,應用行鎖設計,提供MVCC功能,支持事務和非事務安全的選項,以及更好的BLOB字符類型的處理性能。
1.8 其他存儲引擎
MySQL還有很多其他的存儲引擎,包括Merge,CVS,Sphinx,Infobright,它們各自有各自的使用場合。
2 使用存儲引擎
創建表時指定存儲引擎
創建一個InnoDB的數據表,基本格式:
CREATE TABLE 表名(
......
) ENGINE = INNODB;
例:創建country表,指定存儲引擎為InnoDB。
CREATE TABLE country( country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country VARCHAR(50) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (country_id) ) ENGINE = InnoDB DEFAULT CHARSET=gbk;
修改表的存儲引擎
修改表的存儲引擎為InnoDB,基本格式:
ALERT TABLE 表名 ENGINE = INNODB;
使用ALERT TABLE修改表的存儲引擎可能導致數據庫中的數據丟失,所以在修改前,需要備份數據。
為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/3857808.html