天天看點

九爺 帶你玩轉mysql引擎Mylsam

一、 mysql存儲引擎介紹:

MySQL在5.1(不包括)之前的版本中,存儲引擎是需要在MySQL 安裝的時候就必須和MySQL 一起被編譯并同時被安裝的。

但是從MySQL5.1 開始,MySQL AB 對其結構體系做了較大的改造,并引入了一個新的概念:插件式存儲引擎體系結構。 MySQL AB 在架構改造的時候,讓存儲引擎層和sql layer各自更為獨立,耦合更小,甚至可以做到線上加載新的存儲引擎,也就是完全可以将一個新的存儲引擎加載到一個正在運作的MySQL 中,而不影響MySQL 的正常運作。插件式存儲引擎的架構,為存儲引擎的加載和移出更為靈活友善,也使自行開發存儲引擎更為友善簡單。

MySQL的插件式存儲引擎主要包括MyISAM,Innodb,NDB Cluster,Maria,Falcon,Memory,Archive等,其中最著名而且使用最為廣泛的MyISAM 和Innodb兩種存儲引擎。MyISAM 是MySQL 最早的ISAM 存儲引擎的更新版本,也是MySQL 預設的存儲引擎。而Innodb 實際上并不是MySQ 公司的,而是第三方軟體公司Innobase(在2005 年被Oracle 公司所收購)所開發,其最大的特點是提供了事務控制等特性, 是以使用者也非常廣泛。

       二、MyISAM 存儲引擎簡介:

1、mysql5.1之前預設存儲引擎。

2、MyISAM 存儲引擎的表在資料庫中,每一個表都被存放為三個以表名命名的實體檔案。

首先肯定會有任何存儲引擎都不可缺少的存放表結構定義資訊的.frm 檔案,另外還有.MYD和.MYI 檔案,分别存放了表的資料(.MYD)和索引資料(.MYI)。每個表都有且僅有這樣三個檔案做為MyISAM 存儲類型的表的存儲,也就是說不管這個表有多少個索引,都是存放在同一個.MYI 檔案中。

3、MyISAM 支援以下三種類型的索引:

B-Tree 索引

B-Tree 索引,就是所有的索引節點都按照balance tree 的資料結構來存儲,所有的索引資料節點都在葉節點。

R-Tree 索引

R-Tree 索引的存儲方式和b-tree 索引有一些差別,主要設計用于為存儲空間和多元資料的字段做索引,是以目前的MySQL 版本來說,也僅支援geometry 類型的字段作索引。

Full-text 索引

Full-text 索引就是全文索引,他的存儲結構也是b-tree。主要是為了解決在我們需要用like 查詢的低效問題。

MyISAM 上面三種索引類型中,最經常使用的就是B-Tree 索引了,偶爾會使用到Fulltext,但是R-Tree 索引一般系統中都是很少用到的。另外MyISAM 的B-Tree 索引有一個較大的限制,那就是參與一個索引的所有字段的長度之和不能超過1000 位元組。

1、不支援事務

2、隻有表鎖

3、如下情況會造成表損壞:

Mysqld正在寫入該表時,被kill掉

主機當機(Crash)

磁盤硬體故障

MyISAM存儲引擎的bug

雖然每一個MyISAM的表都是存放在一個相同字尾名的.MYD 檔案中,但是每個檔案的存放格式實際上可能并不是完全一樣的,因為MyISAM 的資料存放格式是分為靜态(FIXED)固定長度、動态(DYNAMIC)可變長度以及壓縮(COMPRESSED)這三種格式。

當然三種格式中是否壓縮是完全可以任由自己選擇的,可以在建立表的時候通過ROW_FORMAT 來指定{COMPRESSED | DEFAULT},也可以通過myisampack 工具來進行壓縮,預設是不壓縮的。

而在非壓縮的情況下,是靜态還是動态,就和我們表中個字段的定義相關了。隻要表中有可變長度類型的字段存在,那麼該表就肯定是DYNAMIC 格式的,如果沒有任何可變長度的字段,則為FIXED 格式,當然,你也可以通過alter table 指令,強行将一個帶有VARCHAR 類型字段的DYNAMIC 的表轉換為FIXED,但是所帶來的結果是原VARCHAR 字段類型會被自動轉換成CHAR 類型。相反如果将FIXED 轉換為DYNAMIC,也會将CHAR 類型字段轉換為VARCHAR 類型,

知識點擴充:如何根據表的記錄數量估算占用的磁盤空間

首先先算一個表中一行有多少個位元組。

然後根據資料庫中的表每天增加多少行記錄,就能夠算出每天要增加多少硬碟空間,這樣就可根據資料量估算規劃多大的空間。

例如在資料庫test中建立一張tb1表

九爺 帶你玩轉mysql引擎Mylsam

執行mysql>desc  test1.tb1檢視tb1的表結構

九爺 帶你玩轉mysql引擎Mylsam

10個位元組+20個位元組+2個位元組+20位元組+8位元組+8位元組+100個位元組=168位元組

Tb1表的一個行有118個位元組

如果每天增加10000條記錄,大約需要10000x168/1024/1024=1.6MB

這樣就可以根據每天增加的記錄數,合理規劃好磁盤空間了

MyISAM 存儲引擎的某個表檔案出錯之後,僅影響到該表,而不會影響到其他表,更不會影響到其他的資料庫。如果我們的資料庫正在運作過程中發現某個MyISAM 表出現問題了,則可以線上通過check table 指令來嘗試校驗他,并可以通過repair table 指令來嘗試修複。在資料庫關閉狀态下,我們也可以通過myisamchk 工具來對資料庫中某個(或某些)表進行檢測或者修複。不過強烈建議不到萬不得已不要輕易對表進行修複操作,修複之前盡量做好可能的備份工作,以免帶來不必要的後果。