MySQL數據庫優化三、MySQL體系結構與存儲引擎(下)

MySQL常用存儲引擎

CSV存儲引擎

文件系統存儲特點

CSV存儲引擎可以將CSV文件作爲MySQL的表來處理,這種存儲引擎的存儲格式就是普通的CSV文件。
CSV存儲引擎存儲數據的方式非常有特點,如果我們把數據存入到MyISAM或者Innodb存儲引擎中去的話,數據文件我們是不能直接查看的,因爲這兩種存儲引擎都是以二進制文件來進行存儲的。而CSV存儲引擎則不同,CSV是通過文件的形式來存儲的,數據以文本的方式存儲在文件中,我們可以直接查看文件中的數據。
CSV存儲引擎建立表之後,會產生三個文件,分別是 以 .CSV、.CSM、.frm後綴結尾的文件。.CSV文件存儲表的內容,.CSM文件存儲表的元數據如表狀態和數據量,.frm文件存儲表的結構信息。
在這裏插入圖片描述

功能特點

以CSV格式進行數據存儲

前面說了,CSV存儲引擎最大的特點就是以CSV文件格式進行存儲,存儲內容特點是數據以英文逗號隔開,文本用雙引號引起來。下圖就是CSV文件存儲的內容。
在這裏插入圖片描述

所有列必須都是不能爲NULL的

CSV存儲引擎存儲的數據是不能爲NULL的
在這裏插入圖片描述在這裏插入圖片描述

不支持索引

CSV不支持索引,索引的主要作用就是爲了優化查詢效率。如果一個表不支持索引,那麼每次查詢都會進行全表掃描。對於一個大表來說,查詢效率會非常低。所以從這點來講,CSV存儲引擎不適合大表存儲,以及實時性高,查詢效率要求高的業務查詢。

可以對數據文件直接編輯

因爲存儲的是CSV文件,我們可以直接對文件進行編輯。這一點也是與其他以二進制進行存儲的存儲引擎所不同的。

適用場景

適合作爲數據交換的中間表

我們可以把excel的數據存儲爲CSV格式,然後複製到MySQL目錄下,就可以在MySQL中進行使用了。
同樣的,我們使用CSV存儲引擎,在數據庫中寫入數據後,其他程序也能立刻讀取到寫入的文件內容。

所以說CSV非常適合作爲數據交換的中間表來進行使用。

Archive存儲引擎

文件系統存儲特點

  • 以zlib對錶數據進行壓縮,磁盤I/O更少
    archive存儲引擎會緩存所有的寫,並且會以zlib對插入的行進行壓縮。所以archive存儲引擎會比MyISAM存儲引擎的表更加節約磁盤IO。對於相同數量的數據,archive比MyISAM和Innodb更加節約空間。

  • 數據存儲在ARZ後綴的文件中
    archive存儲引擎存儲的數據文件是以ARZ爲後綴的文件中,同時也與其他存儲引擎一樣也有一個frm的文件,用以存儲表的結構信息。
    在這裏插入圖片描述

功能特點

只支持insert和select操作

相對於其他存儲引擎,最大的不同點就是archive存儲引擎只支持insert和select操作。archive存儲引擎支持行級鎖和專用緩衝區,可以實現高併發的插入。這個存儲引擎在某些方面模仿了事務型存儲引擎的特點,但archive本身並不是事務存儲引擎
在這裏插入圖片描述在這裏插入圖片描述

只允許在自增ID列添加索引

第二個特點就是隻能在自增id列添加索引,不能在其他列添加索引
在這裏插入圖片描述

適用場景

日誌和數據採集類的應用

由於這種存儲引擎的特性決定了,不能支持刪除和修改操作,支持插入和查詢操作。同時能對數據進行壓縮。這種特性就比較適合記錄日誌之類的操作。

Memory存儲引擎

文件系統存儲特點

memory 存儲引擎也稱爲HEAP存儲引擎。這個存儲引擎的所有數據是存儲在內存當中,這也意味着這種存儲引擎表的數據是容易丟失的,一旦MySQL服務器重啓或者由於其他原因導致的服務器關閉,都會導致Memory存儲引擎表中的數據丟失。
表中的數據是存儲在內存當中,但是表結構是獨立的。表結構不會因爲MySQL重啓而丟失。memory存儲引擎的表,只有一個.frm文件,用以存儲表的結構信息。
由於數據是存儲在內存當中,所以memory存儲引擎的表的IO效率要比其他存儲引擎高很多。

功能特點

支持HASH索引和 B-樹索引

在建立索引時,如果沒有指定索引類型,默認會創建HASH索引。由於HASH索引的特點,如果是做等值查詢的話,會非常的快。但是要做範圍查詢的時候,就無法使用HASH索引了。所以當我們建立索引的時候呢,一定要清楚業務如何使用表的,等值查詢場景較多則使用HASH索引,範圍查詢比較多的話使用B-樹索引。

所有字段都爲固定長度

memory表使用固定長度的行存儲格式,可變長度類型如Varchar使用固定長度。比如我們定義時定義了varchar(5)這樣的數據類型,在存儲時都會轉成char(5)。

我們使用varchar可以定義的時候給的長度大一些,因爲這是可變長度,最終佔用的長度根據實際使用的長度決定。比如varchar(5),存儲字符串“abc”,則實際長度爲3。而如果使用char(5),存儲字符串“abc”,實際佔用的長度就是5。

memory存儲引擎的表不能使用可變長度類型,只能使用固定長度類型,這就要求我們定義的時候要注意存儲內容的大小,避免使用固定長度造成存儲空間的浪費或不足。

Memory表不能包含BLOB 或 TEXT列

對於大文本的存儲,memory是不能支持blob或text類型的數據。

Memory存儲引擎使用表級鎖

memory使用的是表級鎖,我們把memory與Innodb做一下比較,memory存儲效率未必就比Innodb高,因爲Innodb也會把熱數據緩存到內存中,而且Innodb是行級鎖,粒度更小一些。

Memory表大小由max_heap_table_size控制

Memory表大小由max_heap_table_size控制,該值默認爲16MB。max_heap_table_size 用戶可以創建的內存表(memory table)的大小.這個值用來計算內存表的最大行數值。
我們可以用下面的語法進行修改,但是注意修改對已經存在的memory表是無效的。

SET GLOBAL max_heap_table_size=2147483648

或者在配置文件中修改

vi /etc/my.cnf 
[mysqld] 
max_heap_table_size = 2048M 
tmp_table_size = 2048M

MEMORY表支持AUTO_INCREMENT列

memory存儲引擎可以使用自增列

像其他非臨時表一樣,非臨時內存表也可多Session共享

memory存儲引擎的表是可以多session之間進行訪問

Memory表與 TEMPORARY(臨時)表

兩者均可將數據放入內存,當臨時表數據超過tmp_table_size時,自動轉化爲磁盤表,性能急劇下降
MEMORY表數據滿之後,會提示錯誤,不會進行轉化。
memory存儲引擎的表是非臨時表,多session是共享可見的。而臨時表則只能當前session可見。

適用場景

用於查找或者是映射表,列如地區對應表

用於保存計算或分析產生的臨時數據

緩存週期性聚合數據的結果表

memory存儲引擎數據是易丟失的,臨時的。我們要注意數據應該是可以重新生成的數據,而不能作爲一種長久存儲的數據進行使用。就類似於我們的緩存操作以一樣。

Federated存儲引擎

FEDERATED存儲引擎能讓你訪問遠程的MySQL數據庫而不使用replication或cluster技術(類似於Oracle的dblink),使用FEDERATED存儲引擎的表,本地只存儲表的結構信息,數據都存放在遠程數據庫上,查詢時通過建表時指定的連接符去獲取遠程庫的數據返回到本地。

存儲特點

1 本地服務器 FEDERATED 存儲引擎的表只存放表的.frm結構文件
2 遠程服務器 存放了.frm和數據文件
3 增刪改查操作都是通過建立的連接來訪問遠程數據庫進行操作,把結果返回給本地。
4 遠程數據表的存儲引擎爲MySQL支持的存儲引擎,如MyISAM,InnoDB等

使用場景

我覺的這個存儲引擎沒啥用,對於這個存儲引擎我也不去深究了。默認MySQL這個存儲引擎是不可用的,想要使用還得再MySQL中開啓。更多的可以參考《 FEDERATED 存儲引擎描述》 這篇文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章