存儲引擎可以理解為一種數據存取和處理方式.Mysql數據庫自帶多種存儲引擎,每種存儲引擎都擁有各自的特性
MEMORY存儲引擎
memory存儲引擎的表只擁有一個磁盤文件,用來存儲表結構的定義,其拓展名為.frm.memory引擎表的數據存在內存中,當Mysql關閉時,所有數據都會消失.
創建表
Create Table t_mem1 CREATE TABLE `t_mem1` (
`id` int(11) DEFAULT NULL
) ENGINE=MEMORY
表結構磁盤文件
插入數據并查詢
重啟數據庫
sudo /etc/init.d/mysql restart
重新查詢數據
memory引擎表的數據存于內存中,那么mysql服務端就要為其單獨分配內存空間,那么考慮以下兩個問題
- memory引擎表占用多大的內存空間,或者說被分配了多少空間
- memory引擎表占用的內存空間什么時候能夠釋放
關于第一個問題,memory引擎表占用的內存空間不能超過系統變量max_heap_table_size 設置的大小,該值默認是16MB.
如果想自由指定大小,可在會話級別設置該變量.
注意,當數據庫重啟時,所有表會自動繼承全局max_heap_table_size ,即都會變成16MB,不管之前設置的是多少.
關于第二個問題,分配給 memory引擎表的內存空間正常狀態下不會回收,只有表被刪除時才會回收.
CSV存儲引擎
CSV存儲引擎基于CSV格式文件存儲數據
CREATE TABLE `t_csv1` (
`id` int(11) NOT NULL,
`v1` varchar(20) NOT NULL DEFAULT ''
) ENGINE=CSV
插入數據并查詢
此時磁盤上會有三個對應文件
.frm是表的結構定義文件
.csv 是數據文件,保存在表中插入的數據,這個文件可以直接在excel或其他編輯文件中打開.
.csm 是元信息文件,用來保存表的狀態和表中保存的數據量.
打開.csv文件,可以看到存儲的內容如下
下面嘗試直接在.csv數據文件中插入數據
重啟數據庫查詢一下數據
可以看到直接操作.csv文件存儲數據也是可行的,但這種方式存在風險.下面我們來插入這樣兩條數據
重啟數據庫查詢一下數據
可以看到由于剛才我們插入了一條不合理數據,導致表被破壞,需要修復.下面進行檢查和修復.
數據修復后再來查詢數據
再來看一下數據文件中的數據
check 用法
check語句會會檢查每行記錄是否合法,一旦發現不合法的行就會拋出錯誤,用repair進行修復時,一旦發現不合法行,其后面的數據都會丟失,不管這當中是否包括合法行.
ARCHIVE存儲引擎
ARCHIVE存儲引擎最大的特點就是使用zlib無損數據壓縮算法將數據進行壓縮存儲,從而節省空間.并且還可以使用optimize table分析表并使其打包成更小的格式.
創建表,并查詢所占空間
查詢存儲引擎為MyISAM的表
從兩張表的Data_length字段可以看出,archive引擎表所占空間更小,當然這里由于數據量較小,看著差距并不太明顯.
ARCHIVE存儲引擎 存儲引擎目前僅能insert和select語句,不能支持delete和update語句.
ARCHIVE引擎 表擁有一個.frm的結構定義文件,還有一個.arz的數據文件.
BLACKHOLE存儲引擎
從上圖可以看到,創建了一個blackhole引擎表,并插入了兩條數據,但查詢時卻返回為空. 這就是BLACKHOLE存儲引擎,雖然可以像其他存儲引擎一樣接受數據,但是插入的數據并不會被保存,blackhole引擎表永遠保持為空.
但是雖然BLACKHOLE存儲引擎并不保存數據,但如果啟用binlog,那么執行的sql語句是會被記錄的,結合賦值賦值特性,產生一些有意思的作用.
MERGE存儲引擎
MERGE存儲引擎也被成為MERGE_MyISAM存儲引擎,就是將一組MyISAM聚合在一起,使用是就像一張表,以此來簡化操作.MERGE存儲引擎能夠聚合的MyISAM的表必須完全一致.
下面創建merge引擎表,并查詢數據
從上面的查詢結果可以看出,merge引擎表的結果就像是執行了
merge引擎表有一個.frm的表結構定義文件,還有一個.mgr的文件,這個文件中不保存數據,而是記錄數據的來源.
merge引擎表不僅支持查詢,還支持插入,修改,刪除,在執行update和delete時,和普通用法一樣.insert 有一點特殊,因為merge引擎表是一個集合,如果按照普通用法,它是不知道將數據插到那個MyISAM表中的.所以需要增加一個insert_method選項.
NO: 不允許插入,也是默認值
first:插入到第一個表中
last:插入到最后一個表中
MyISAM存儲引擎和InnoDB存儲引擎
選項 | MyISAM存儲引擎 | InnoDB存儲引擎 |
---|---|---|
最大存儲能力 | 256TB | 64TB |
MVCC | No | Yes |
B-tree索引 | Yes | Yes |
Clustered索引 | No | Yes |
Hash索引 | No | No |
全文檢索索引 | Yes | No |
索引緩存 | Yes | Yes |
數據壓縮 | Yes | Yes |
復制 | Yes | Yes |
查詢緩存 | Yes | Yes |
事務 | No | Yes |
數據緩存 | No | Yes |
數據加密 | Yes | Yes |
外鍵約束 | No | Yes |
鎖力度 | Table | Row |
集群數據庫 | No | No |
備份/時間點恢復 | Yes | Yes |
-
MyISAM存儲引擎
在MERGE存儲引擎部分,已經創建了MyISAM引擎表.MyISAM引擎表在磁盤上會有三個對應文件,如下圖
.frm 表結構定義文件
.MYD 數據文件,存儲數據
.MYI 索引文件,用來存儲表的索引信息
MyISAM存儲引擎 鎖粒度太粗,是表級鎖,不支持事務 - InnoDB存儲引擎
創建一個 InnoDB引擎表
在磁盤上只能看到一個.frm的表結構定義文件,并沒有數據文件
InnoDB存儲引擎的數據存在哪里呢?InnoDB存儲引擎有一個表空間的概念,且這只是一個邏輯上的概念,在物理磁盤上可能對應多個數據文件.