📢博客主頁:https://blog.csdn.net/2301_779549673
📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📢本文由 JohnKi 原創,首發于 CSDN🙉
📢未來很長,值得我們全力奔赴更美好的生活?
文章目錄
- 🏳??🌈一、ARCHIVE 存儲引擎的特性
- 🏳??🌈二、創建 ARCHIVE 表
- 🏳??🌈三、BLACKHOLE 存儲引擎的特性
- 🏳??🌈四、BLACKHOLE 存儲引擎的用途
- 🏳??🌈五、創建BLACKHOLE表
- 🏳??🌈六、MERGE 存儲引擎特性
- 🏳??🌈七、創建MERGE表
- 🏳??🌈八、操作 MERGE 表
- 👥總結
使用 ARCHIVE
存儲引擎創建的表,存儲大量不被索引的數據且占用空間很小,一般用于歸檔數據的存儲。
🏳??🌈一、ARCHIVE 存儲引擎的特性
- 支持
INSERT
,REPLACE
和SELECT
,但不支持DELETE
和UPDATE
- 支持列的
AUTO INCREMENT
屬性,該列可以有唯一約束,且手動指定的值不能小于該列的最大值; - 不支持索引,在任何列上嘗試建立索引都會報錯;
- 插入時,數據將被壓縮,
ARCHIVE
引擎使用zlib
無損數據壓縮;INSERT
語句只是將數據寫入壓縮緩沖區并且根據需要刷新到磁盤,當執行SELECT
時會強制刷新緩沖區: - 檢索時,按需要進行解壓縮,不支持行緩存;
SELECT
操作執行全表掃描,找出當前查詢的行,并讀取行數;- 使用行級鎖定
- 不支持表分區
🏳??🌈二、創建 ARCHIVE 表
在MySQL 8.0中 InnoDB 是默認引擎,所以在創建表時需要指定 ENGINE=ARCHIVE
# 創建?個使?ARCHIVE存儲引擎的表
CREATE TABLE t_archive (id int(11) UNIQUE AUTO_INCREMENT,name varchar(20)
) ENGINE = ARCHIVE;
創建 ARCHIVE 表會根據表名生成兩個不同后綴名文件,
- 分別是以
.ARZ
為后綴的數據文件, - 以
.sdi
為后綴的表信息描述文件(JSON格式), .ARN
文件在優化操作期間可能會出現。
🏳??🌈三、BLACKHOLE 存儲引擎的特性
BLACKHOLE
存儲引擎就像?個"?洞",接受數據,但不存儲數據,檢索時總是返回?個空結果
- BLACKHOLE 表不會存儲任何數據,但如果啟用了基于語句的二進制日志記錄,則會記錄 SQL語句并將其復制到副本服務器
- 支持索引;
- 不支持分區;
🏳??🌈四、BLACKHOLE 存儲引擎的用途
- 驗證轉儲?件語法
- 通過?較啟?和不啟??進制?志記錄的性能,測量?進制?志記錄的開銷;
- 本質上是?個 "?操作"的存儲引擎,可?于查找與存儲引擎本??關的性能瓶頸
🏳??🌈五、創建BLACKHOLE表
- 在MySQL 8.0中 InnoDB 是默認引擎,所以在創建表時需要指定
ENGINE=BLACKHOLE
- 創建 BLACKHOLE 表時,服務器會在全局數據字典中創建表定義并?成 .sdi 為后綴的表信息描述?件
mysql> CREATE TABLE t_blackhole(id INT, content CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO t_blackhole VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> SELECT * FROM t_blackhole;
Empty set (0.00 sec)
🏳??🌈六、MERGE 存儲引擎特性
MERGE
存儲引擎,也稱為 MRG_MyISAM
引擎,允許MySQL DBA或開發?員在邏輯上將?系列相同的MyISAM表分組,并將它們作為?個對象引?。適?于VLDB(Very Large Data Bases)環境,如數據倉庫。這里的相同表示所有表中的列都有相同的數據類型和索引信息。
?意圖如下
🏳??🌈七、創建MERGE表
- 在MySQL8.0中 InnoDB 是默認引擎,所以在創建表時需要指定
ENGINE=MERGE
- 創建MERGE表必須指定
UNION=(list-of-tables)
選項,表示要使用哪些MyISAM表; - 還可以通過指定
INSERT_METHOD
選項來控制如何對MERGE表進行插入操作,FIRST
或LAST
值分別表示在第一個或最后一個基礎表中進行插入 - 如果沒有指定
INSERT_METHOD
選項,或者指定它的值為 NO ,那么在 MERGE 表中執行插入將會報錯;
# 創建基礎表1
mysql> CREATE TABLE test_m1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
content CHAR(20)) ENGINE=MyISAM;# 創建基礎表2
mysql> CREATE TABLE test_m2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
content CHAR(20)) ENGINE=MyISAM;# 向基礎表中寫?數據
mysql> INSERT INTO test_m1 (content) VALUES ('Testing1'),('table1'),('test_m1');
mysql> INSERT INTO test_m2 (content) VALUES ('Testing2'),('table2'),('test_m2');# 創建MERGE表
mysql> CREATE TABLE t_merge (
id INT NOT NULL AUTO_INCREMENT,
content CHAR(20), INDEX(id))
ENGINE=MERGE UNION=(test_m1,test_m2) INSERT_METHOD=LAST;
創建 MERGE 表時,會在磁盤上創建一個.mrg
文件,其中包含了基礎MyISAM表的名稱。
MERGE的表格式存儲在MySOL數據字典中;
.sdi
為后綴的表信息描述文件;
🏳??🌈八、操作 MERGE 表
基礎表中的 id
列作為 PRIMARY KEY
索引,但在MERGE表中并不作為主鍵,但是可以被索引。
因為 MERGE
表不能對基礎表集強制唯一性,類似的,基礎表中具有 UNIOUE
索引的列可以在 MERGE
表中被索引,但不能作為唯一約束
查詢示例:
mysql> select * from t_merge;
+----+----------+
| id | content |
+----+----------+
| 1 | Testing1 |
| 2 | table1 |
| 3 | test_m1 |
| 1 | Testing2 |
| 2 | table2 |
| 3 | test_m2 |
+----+----------+
6 rows in set (0.00 sec)
要將MERGE表重新映射到不同的MyISAM基礎表集合,您可以使用以下方法之一
- 刪除
MERGE
表并重新創建:。 - 使用
ALTER TABLE tbl name UNION=(..)
修改基礎表的集合; - ALTER TABLE…UNION=()列表為空時,表示刪除所有基礎表
使用 DROP TABLE
只會刪除 MERGE
表定義,基礎 MyISAM
表不受影響。
關于MERGE表的替代方案可以使用表分區,可以支持主鍵索引,唯一索引,全文索引等,我們在分庫分表與表分區專題中介紹
👥總結
本篇博文對 ? 做了一個較為詳細的介紹,不知道對你有沒有幫助呢
覺得博主寫得還不錯的三連支持下吧!會繼續努力的~