MySQL存儲引擎


為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/SJQ。

http://www.cnblogs.com/shijiaqi1066/p/3857808.html

 

 

 

1 存儲引擎概述

存儲引擎就是存儲數據,建立索引,更新查詢數據等等技術的實現方式。

存儲引擎是基於表的,而不是基於庫的。所以存儲引擎也可被稱為表類型。

Oracle,SqlServer等數據庫只有一種存儲引擎。MySQL提供了插件式的存儲引擎架構。所以MySQL存在多種存儲引擎,可以根據需要使用相應引擎,或者編寫存儲引擎。

 

查詢MySQL系統中支持的存儲引擎

使用MySQL客戶端命令,顯示當前MySQL系統所支持的數據庫引擎。

命令:show engines;

wps_clip_image-9130

 

查看當前默認使用的存儲引擎

命令:show variables like 'table_type';

wps_clip_image-19088

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM