<!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1
15. 其他存儲引擎
15.8.2.1 使用CONNECTION創建FEDERATED
15.8.2.2 創建FEDERATED表使用CREATE SERVER
存儲引擎是MySQL組件,用來控制不同表類型的SQL操作。InnoDB是預設而且是最常用的存儲引擎,Oracle推薦使用,除非是特別的使用場景。
MySQL Server使用可插入的存儲引擎結構可以讓正在運行MySQL的存儲引擎load,unload。
可以使用SHOW ENGINES語句來決定引擎是不是可以使用。Support欄位說明引擎是不是被支持。
MySQL 5.6支持的存儲引擎
InnoDB:MySQL 5.6預設的存儲引擎。InnoDB是事務安全的存儲引擎,有commit,rollback,crash-recovery功能來保護用戶數據。InnoDB行級鎖和Oracle樣式的一致性無鎖讀,增加多用戶併發和性能。InnoDB以聚集索引方式存儲用戶數據,對主鍵查詢,可以減少IO。InnoDB也支持外鍵約束。
MyISAM:這些表footprint比較小,表級鎖定限制了讀寫性能,一般用於只讀或者讀多寫少的應用。
Memory:所有的數據都存放在RAM內,能夠快速的訪問數據。這個引擎就是以前的HEAP引擎。
CSV:這個表實際上是文本文件使用了逗號分隔值。CSV表一般用於導入導出,數據線存放在InnoDB,在需要導入導出的時候轉為CSV表。
Archive:這個是緊密的非索引表,用來存儲和獲取大量數據。
Blackhole:這個引擎其實不保存數據,和linux的/dev/null一樣。查詢結果都是為空,這些表可以複製,DML語句會傳到Slave,但是master不保存數據。
Merge:可以讓DBA和開發邏輯的把一些MyISAM表當成一個對象。
Federated:連接到獨立的MySQL服務,在這個邏輯資料庫上為很多歌物理服務創建對象。
Example:這個是MySQL的例子,如何開始編寫新的存儲引擎。。
以下是不同存儲引擎的基本特點:
Feature |
MyISAM |
Memory |
InnoDB |
Archive |
NDB |
Storage limits |
256TB |
RAM |
64TB |
None |
384EB |
Transactions |
No |
No |
Yes |
No |
Yes |
Locking granularity |
Table |
Table |
Row |
Row |
Row |
MVCC |
No |
No |
Yes |
No |
No |
Geospatial data type support |
Yes |
No |
Yes |
Yes |
Yes |
Geospatial indexing support |
Yes |
No |
Yes[a] |
No |
No |
B-tree indexes |
Yes |
Yes |
Yes |
No |
No |
T-tree indexes |
No |
No |
No |
No |
Yes |
Hash indexes |
No |
Yes |
No[b] |
No |
Yes |
Full-text search indexes |
Yes |
No |
Yes[c] |
No |
No |
Clustered indexes |
No |
No |
Yes |
No |
No |
Data caches |
No |
N/A |
Yes |
No |
Yes |
Index caches |
Yes |
N/A |
Yes |
No |
Yes |
Compressed data |
Yes[d] |
No |
Yes[e] |
Yes |
No |
Encrypted data[f] |
Yes |
Yes |
Yes |
Yes |
Yes |
Cluster database support |
No |
No |
No |
No |
Yes |
Replication support[g] |
Yes |
Yes |
Yes |
Yes |
Yes |
Foreign key support |
No |
No |
Yes |
No |
No |
Backup / point-in-time recovery[h] |
Yes |
Yes |
Yes |
Yes |
Yes |
Query cache support |
Yes |
Yes |
Yes |
Yes |
Yes |
Update statistics for data dictionary |
Yes |
Yes |
Yes |
Yes |
Yes |
[a] InnoDB support for geospatial indexing is available in MySQL 5.7.5 and higher. [b] InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature. [c] InnoDB support for FULLTEXT indexes is available in MySQL 5.6.4 and higher. [d] Compressed MyISAM tables are supported only when using the compressed row format. Tables using the compressed row format with MyISAM are read only. [e] Compressed InnoDB tables require the InnoDB Barracuda file format. [f] Implemented in the server (via encryption functions), rather than in the storage engine. [g] Implemented in the server, rather than in the storage engine. [h] Implemented in the server, rather than in the storage engine. |
15.1 設置存儲引擎
當你創建新表,你會指定存儲引擎,在ENGINE選項上。
-- ENGINE=INNODB not needed unless you have set a different
-- default storage engine.
CREATE TABLE t1 (i INT) ENGINE = INNODB;
-- Simple table definitions can be switched from one to another.
CREATE TABLE t2 (i INT) ENGINE = CSV;
CREATE TABLE t3 (i INT) ENGINE = MEMORY;
當你忽略ENGINE選項,就是用預設存儲引擎。目前預設存儲引擎是InnoDB。你可以 指定預設存儲引擎通過—default-storage-engine啟動參數,或者配置文件中指定default-storage-engine。也可以在runtime設置使用set命令設置變數:
SET default_storage_engine=NDBCLUSTER;
臨時表的存儲引擎,通過create temporary table來創建,預設存儲引擎通過default_tmp_storage_engine在啟動前或者runtime設置。
可以使用alter table語句來轉化表的存儲引擎
ALTER TABLE t ENGINE = InnoDB;
如果指定的存儲引擎沒有被編譯或者已經編譯了但是沒有激活,MySQL會使用預設存儲引擎來代替。為了防止被魔火,可以啟動NO_ENGINE_SUBSTITUTUIN SQL模式。如果指定的引擎不可用,會產生一個錯誤,而不是一個警告,表不會被創建。
對於新表,frm文件用來保存表和列的定義。表的索引和數據可能被存放在其他一個或者多個文件中,根據存儲引擎決定。