Mysql--存儲引擎

存儲引擎可以理解為一種數據存取和處理方式.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服務端就要為其單獨分配內存空間,那么考慮以下兩個問題

  1. memory引擎表占用多大的內存空間,或者說被分配了多少空間
  2. 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的表


acc1.png

從兩張表的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
  1. MyISAM存儲引擎
    在MERGE存儲引擎部分,已經創建了MyISAM引擎表.MyISAM引擎表在磁盤上會有三個對應文件,如下圖



    .frm 表結構定義文件
    .MYD 數據文件,存儲數據
    .MYI 索引文件,用來存儲表的索引信息
    MyISAM存儲引擎 鎖粒度太粗,是表級鎖,不支持事務

  2. InnoDB存儲引擎
    創建一個 InnoDB引擎表

在磁盤上只能看到一個.frm的表結構定義文件,并沒有數據文件


InnoDB存儲引擎的數據存在哪里呢?InnoDB存儲引擎有一個表空間的概念,且這只是一個邏輯上的概念,在物理磁盤上可能對應多個數據文件.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容