MySQL儲存與引擎
儲存引擎,表處理器,表型別;
文章目錄
引擎
MySQL提供不同的引擎型別,對不同的表進行儲存和管理。表的儲存到資料庫中,最後落入檔案或者記憶體、或者根據不同的業務是否需要事務管理,或者支援的索引等等功能,選擇不同的儲存引擎,滿足不同的效率要求等。
不同的儲存引擎提供額外的效率、功能等,對不同需求的表進行管理儲存,提升不同的效益。
可以選擇適用不同伺服器、資料庫和表格的儲存引擎。在選擇怎麼儲存(記憶體?檔案),怎麼索引(全文?雜湊?其他?),存什麼樣的資料(文字?csv?),支不支援聯機事務處理等;提供不同的需求,不同的效能和靈活性。
資料庫引擎是用於儲存、處理和保護資料的核心服務。儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。
型別
- InnoDB
- MyISAM
- MRG_MYISAM
- MEMORY
- CSV
- ARCHIVE
- BLACKHOLE
- PERFORMANCE_SCHEMA
- FEDERATED
操作
-
檢視
-
SHOW VARIABLES LIKE '%storage_engine%
-
SHOW ENGINES\G;
-
INFORMATION_SCHEMA.ENGINES表
-
-
修改
- 安裝環境的配置
my.cnf
-----修改預設儲存引擎欄位 - 建立表/修改表/時:
CREATE TABLE XX ...ENGINE=InnoDB
- 檢視:
show create table xx
- 安裝環境的配置
-
其他
InnoDB
MySQL預設的儲存引擎(V5.6之後)。一個健壯的事務型儲存引擎------操作非常大的資料量,提供行級鎖定和外來鍵約束。一般來說,如果需要事務支援,並且有較高的併發讀取頻率,InnoDB是不錯的選擇。
特點:
- 提供ACID的事務性支援,實現了四種隔離級別(無操作、髒讀、重複讀、幻度)。
- 行級鎖定和外來鍵約束,滿足處理大容量資料庫系統的目標
- 從V5.6開始支援全文索引
- 系統崩潰後可以自動恢復
- 外來鍵和引用完整性支援,包括級聯刪除和更新; 基於行級別的鎖定和多版本化,良好的併發效能
適用:
- 經常更新的表,適合多重併發請求
- 事務操作
- 自動災難恢復。與其它儲存引擎不同,InnoDB表能夠自動從災難中恢復。
- 外來鍵約束
- 列自增,auto_increment
MyISAM
MyISAM表是獨立於作業系統的,可以輕鬆地將其從Windows伺服器移植到Linux伺服器;每當我們建立一個MyISAM引擎的表時,就會在本地磁碟上建立三個檔案,檔名就是表名。例如,我建立了一個MyISAM引擎的tb_Demo表,那麼就會生成以下三個檔案:tb_demo.frm,儲存表定義;tb_demo.MYD,儲存資料;tb_demo.MYI,儲存索引。
如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支援,那麼MyIASM也是很好的選擇。
特點:
- 不支援事務,沒有行級鎖和外來鍵-----插入和更新操作會鎖定全表,效能低
- 使用一種表格鎖定機制,實現併發(犧牲空間)
- 強調快速讀取,不支援災難恢復
適用:
- 選擇密集的表:篩選大量資料時效能優
- 更新密集的表:MyISAM的併發插入特性允許同時選擇和插入資料。例如:MyISAM儲存引擎很適合管理郵件或Web伺服器日誌資料。
MRG_MyISAM
是一個相同的可以被當作一個來用的MyISAM表的集合,所有的表有同樣的列(名字、型別)和索引資訊。和舊版本的MERGE 是同一種來源。對一個MERGE表操作其實就是對其中的MyISAM表進行操作。
適用:
- 伺服器日誌,多個相同表的資料
- MERGE表是在MyISAM表的基礎上進行定義的,就如同檢視那樣;刪除不會影響原表資料。
alter table tb_merge engine=merge union(tb_log1) insert_method=last;
- 上述定義中,union表示關聯哪些表,insert_method 表示插入資料的方法,取值域為[0,FIRST,LAST];分別表示不允許插入、插入第一個表和插入最後一個表
MEMORY
在記憶體中建立表,效能高。要求儲存在表中的資料使用的是長度不變的格式,預設使用Hash索引。
特點:
- 訪問存取效率高,記憶體訪問
- 資料容易丟失,關機則失去
- 支援雜湊索引和B樹索引
- [Added]B樹索引的優於雜湊索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等操作符方便資料探勘。雜湊索引進行“相等比較”非常快,但是對“範圍比較”的速度就慢多了,因此雜湊索引值適合使用在=和<>的操作符中,不適合在<或>操作符中,也同樣不適合用在order by子句中。
適用:
- 目標資料較小,頻繁訪問使用的資料(類似快取機制);可以通過引數max_heap_table_size控制Memory表的大小
- 臨時資料
- 資料丟失對使用環境沒有影響
BLACKHOLE
任何寫入到此引擎的資料均會被丟棄掉, 不做實際儲存;Select語句的內容永遠是空。他會丟棄所有的插入的資料,伺服器會記錄下Blackhole表的日誌,所以可以用於複製資料到備份資料庫。
適用:
- 充當日誌伺服器
- 驗證dump file語法的正確性??
ARCHIVE
Archive是歸檔的意思,在歸檔之後很多的高階功能就不再支援了,僅僅支援最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支援索引,但是在MySQL 5.5以後的版本中就開始支援索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。
特點:
- 行級鎖,不支援事務
小結&對比
【表參考連結:https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md】
特性 | InnoDB | MyISAM | MEMORY | ARCHIVE |
---|---|---|---|---|
儲存限制(Storage limits) | 64TB | No | YES | No |
支援事物(Transactions) | Yes | No | No | No |
鎖機制(Locking granularity) | 行鎖 | 表鎖 | 表鎖 | 行鎖 |
B樹索引(B-tree indexes) | Yes | Yes | Yes | No |
T樹索引(T-tree indexes) | No | No | No | No |
雜湊索引(Hash indexes) | Yes | No | Yes | No |
全文索引(Full-text indexes) | Yes | Yes | No | No |
叢集索引(Clustered indexes) | Yes | No | No | No |
資料快取(Data caches) | Yes | No | N/A | No |
索引快取(Index caches) | Yes | Yes | N/A | No |
資料可壓縮(Compressed data) | Yes | Yes | No | Yes |
加密傳輸(Encrypted data[1]) | Yes | Yes | Yes | Yes |
叢集資料庫支援(Cluster databases support) | No | No | No | No |
複製支援(Replication support[2]) | Yes | No | No | Yes |
外來鍵支援(Foreign key support) | Yes | No | No | No |
儲存空間消耗(Storage Cost) | 高 | 低 | N/A | 非常低 |
記憶體消耗(Memory Cost) | 高 | 低 | N/A | 低 |
資料字典更新(Update statistics for data dictionary) | Yes | Yes | Yes | Yes |
備份/時間點恢復(backup/point-in-time recovery[3]) | Yes | Yes | Yes | Yes |
多版本併發控制(Multi-Version Concurrency Control/MVCC) | Yes | No | No | No |
批量資料寫入效率(Bulk insert speed) | 慢 | 快 | 快 | 非常快 |
地理資訊資料型別(Geospatial datatype support) | Yes | Yes | No | Yes |
地理資訊索引(Geospatial indexing support[4]) | Yes | Yes | No | Yes |