## 存儲引擎
MySQL 有 MyISAM,InnoDB,Memory,Archive,Merge 等存儲引擎(表類型)。每一種存儲引擎都有其自己的屬性和優點。
查看當前 MySQL 支持的存儲引擎:
show engines;
查看當前 MySQL 默認存儲引擎:
show variables like 'storage_engine';
在MySQL中,不需要在整個服務器中使用同一種存儲引擎,針對具體的要求,可以對每一個表使用不同的存儲引擎。
### MyISAM 存儲引擎:
MyISAM擁有較高的插入、查詢速度,但不支持事物。MyISAM 主要特性有:
1、大文件(達到63位文件長度)在支持大文件的文件系統和操作系統上被支持
2、當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。
3、每個 MyISAM 表最大索引數是 64,這可以通過重新編譯來改變。每個索引最大的列數是 16。
4、最大的鍵長度是 1000 字節,這也可以通過編譯來改變,對于鍵長度超過250字節的情況,一個超過1024字節的鍵將被用上。
5、BLOB 和 TEXT 列可以被索引,支持全文索引。
6、NULL 被允許在索引的列中,這個值占每個鍵的 0~1 個字節。
7、所有數字鍵值以高字節優先被存儲以允許一個更高的索引壓縮。
8、每個 MyISAM 類型的表都有一 個AUTO_INCREMENT 的內部列,當 INSERT 和 UPDATE 操作的時候該列被更新,同時 AUTO_INCREMENT 列將被刷新。
9、可以把數據文件和索引文件放在不同目錄。
10、每個字符列可以有不同的字符集。
11、有 VARCHAR 的表可以固定或動態記錄長度。
12、VARCHAR 和 CHAR 列可以多達 64KB。
使用 MyISAM 引擎創建數據表,將產生 3 個文件。文件的名字以表名字開始,表定義文件的擴展名為 .frm、數據文件的擴展名為 .MYD、索引文件的擴展名為 .MYI
### InnoDB 存儲引擎:
InnoDB 是事務型數據庫的首選引擎,支持事務安全(ACID),支持行鎖定和外鍵,InnoDB 是默認的 MySQL 存儲引擎。InnoDB 主要特性有:
1、InnoDB 給 MySQL 提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。InnoDB 鎖定在行級并且也在 SELECT 語句中提供一個類似 Oracle 的非鎖定讀。
2、InnoDB 是為處理巨大數據量的最大性能設計。它的 CPU 效率可能是任何其他基于磁盤的關系型數據庫引擎鎖不能匹敵的。
3、InnoDB 存儲引擎完全與 MySQL 服務器整合,InnoDB 存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB 將它的表和索引在一個邏輯表空間中,表空間可以包含數個文件。
4、InnoDB 支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每一行生成一個 6 字節的 ROWID,并以此作為主鍵。
InnoDB 不創建目錄,使用 InnoDB 時,MySQL 將在 MySQL 數據目錄下創建一個名為 ibdata1 的 10MB 大小的自動擴展數據文件,以及兩個名為 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件。
### Memory 存儲引擎:
MEMORY 存儲引擎將表中的數據存儲到內存中,為查詢和引用其他表數據提供快速訪問。MEMORY 主要特性有:
1、MEMORY 表的每個表可以有多達 32 個索引,每個索引 16 列,以及 500 字節的最大鍵長度。
2、MEMORY 存儲引擎支持 HASH 和 BTREE 索引。
3、可以在一個 MEMORY 表中有非唯一鍵值。
4、MEMORY 表使用一個固定的記錄長度格式。
5、MEMORY 不支持 BLOB 或 TEXT列。
6、MEMORY 支持 AUTO_INCREMENT 列和對可包含 NULL 值的列的索引。
7、MEMORY 表在所由客戶端之間共享。
8、MEMORY 表內容被存儲在內存中。
### 部分功能對比
| 功能 | MYISAM | Memory | InnoDB | Archive |
| --- | --- | --- | --- |
| 存儲限制 | 256TB | RAM | 64TB | None |
| 支持事物 | No | No | Yes | No |
| 支持全文索引 | Yes | No | No | No |
| 支持數索引 | Yes | Yes | Yes | No |
| 支持哈希索引 | No | Yes | No | No |
| 支持數據緩存 | No | N/A | Yes | No |
| 支持外鍵 | No | No | Yes | No |
參考鏈接:
- [MySQL Alternative Storage Engines](https://dev.mysql.com/doc/refman/5.6/en/storage-engines.html)
- [如何選擇MySQL存儲引擎](http://www.cnblogs.com/xujishou/p/6343431.html)