主要的數據庫引擎
https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
-
InnoDB
MySQL 8.0中的默認存儲引擎。 InnoDB是一種適用於MySQL的事務安全(支持ACID特性)存儲引擎,具有提交,回滾和崩潰恢復功能,可保護用戶數據。 InnoDB支持行級鎖定和Oracle風格的一致非鎖定讀(consistent nonlocking reads)增加了多用戶併發性和性能。 InnoDB將用戶數據存儲在聚簇索引中,以減少基於主鍵的常見查詢的I/O. 爲了保持數據完整性,InnoDB還支持FOREIGN KEY參照完整性約束。
-
MyISAM
這些表佔用資源少。 表級鎖定限制了讀/寫工作負載的性能,因此它通常用於Web和數據倉庫配置中的只讀或大部分讀取工作負載。
-
Memory
將所有數據存儲在RAM中,以便在需要快速查找非關鍵( non-critical)數據的環境中快速訪問。 這個引擎的前身爲HEAP引擎。 InnoDB及其緩衝池內存區域提供了一種通用且持久的方式來將大部分或全部數據保存在內存中,NDBCLUSTER爲大型分佈式數據集提供快速鍵值查找。
-
CSV
它的表實際上是逗號分隔值的文本文件。 CSV表允許您以CSV格式導入或轉儲數據,以便與讀取和寫入相同格式的腳本和應用程序交換數據。 由於CSV表沒有索引,因此通常在正常操作期間將數據保留在InnoDB表中,並且僅在導入或導出階段使用CSV表。
-
Archive
這些緊湊的無索引表旨在存儲和檢索大量很少使用的歷史,存檔或安全審計信息。
-
Blackhole
Blackhole存儲引擎接收但不存儲數據,類似於Unix
/dev/null
設備。 查詢語句始終返回空集。 這些表可用於將DML語句發送到從屬服務器的複製配置操作,但主服務器不保留其自己的數據副本。 -
NDB(NDBCLUSTER)
該聚集數據庫引擎特別適用於需要儘可能高的正常運行時間和可用性的應用程序。
-
Merge
使MySQL DBA或開發人員能夠對一系列相同的MyISAM表進行邏輯分組,並將它們作爲一個對象引用。 適用於數據倉庫等VLDB環境。
-
Federated
提供鏈接多個獨立MySQL服務器創建一個邏輯數據庫的功能。 非常適合分佈式環境。
-
Example
該引擎作爲MySQL源代碼中的一個示例,說明了如何開始編寫新的存儲引擎。 它主要是開發人員感興趣的。 存儲引擎是一個什麼都不做的“存根”。 您可以使用此引擎創建表,但不能在其中存儲數據或從中檢索數據。
特性對比
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B-tree indexes | Yes | Yes | Yes | No | No |
Backup/point-in-time recovery (note 1) | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Clustered indexes | No | No | Yes | No | No |
Compressed data | Yes (note 2) | No | Yes | Yes | No |
Data caches | No | N/A | Yes | No | Yes |
Encrypted data | Yes (note 3) | Yes (note 3) | Yes (note 4) | Yes (note 3) | Yes (note 3) |
Foreign key support | No | No | Yes | No | Yes (note 5) |
Full-text search indexes | Yes | No | Yes (note 6) | No | No |
Geospatial data type support | Yes | No | Yes | Yes | Yes |
Geospatial indexing support | Yes | No | Yes (note 7) | No | No |
Hash indexes | No | Yes | No (note 8) | No | Yes |
Index caches | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Replication support (note 1) | Yes | Limited (note 9) | Yes | Yes | Yes |
Storage limits | 256TB | RAM | 64TB | None | 384EB |
T-tree indexes | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Update statistics for data dictionary | Yes | Yes | Yes | Yes | Yes |
Federated
使用一個標準存儲引擎(如MyISAM,CSV或InnoDB)創建表時,該表由表定義和對應數據組成。 創建FEDERATED表時,表定義相同,但數據的物理存儲在遠程服務器上處理。
FEDERATED表包含兩個部分:
-
具有數據庫表的遠程服務器,該數據庫表又由表定義(存儲在MySQL數據字典中)和相關的表組成。 遠程表的表類型可以是遠程mysqld服務器支持的任何類型,包括MyISAM或InnoDB。
-
具有數據庫表的本地服務器,其中表定義與遠程服務器上的相應表的定義匹配。 表定義存儲在數據字典中。 本地服務器上沒有數據文件。 相反,表定義包括指向遠程表的連接字符串。
在本地服務器上的FEDERATED表上執行查詢和語句時,通常會從本地數據文件插入,更新或刪除信息的操作將被髮送到遠程服務器執行,在那裏他們更新遠程服務器上的數據文件或從遠程服務器返回匹配的行。
圖16.2 FEDERATED表結構
當客戶端發出一個關於FEDERATED表的SQL語句時,本地服務器(執行SQL語句的位置)與遠程服務器(物理存儲數據的位置)之間的信息流如下:
- 存儲引擎查看FEDERATED表所具有的每個列,並構造引用遠程表的相應SQL語句。
- 使用MySQL客戶端API將語句發送到遠程服務器。
- 遠程服務器處理該語句,本地服務器檢索該語句生成的任何結果(受影響的行計數或結果集)。
- 如果語句生成結果集,則每列都將轉換爲FEDERATED引擎所期望的內部存儲引擎格式,並可用於將結果顯示給發出原始語句的客戶端。
本地服務器使用MySQL客戶端C API函數與遠程服務器通信。 它調用mysql_real_query()
來發送語句。 使用mysql_store_result()
讀取結果集,使用mysql_fetch_row()
讀取一行。