Mysql 學習 MyISAM儲存引擎 一 。

2021-09-23 21:37:39 字數 3590 閱讀 1139

myisam是預設儲存引擎。

每個myisam在磁碟上儲存成三個檔案。

第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm檔案儲存表定義。

資料檔案的擴充套件名為.myd (mydata)。

索引檔案的副檔名是.myi (myindex)。

想要用乙個myisam**,可以使用如下語句:

create table t (i int) engine = myisam;

一般地,engine選項是不必要的;除非預設已經被改變了,myisam是預設儲存引擎。

如下是myisam儲存引擎的一些特徵:

·所有資料值先儲存低位元組。這使得資料機和作業系統分離。二進位制輕便性的唯一要求是機器使用補碼和ieee浮點格式。

先儲存資料低位元組並不嚴重地影響速度;資料行中的位元組一般是未聯合的,從乙個方向讀未聯合的位元組並不比從反向讀更占用更多的資源。伺服器上的獲取列值的**與其它**相比並不顯得時間緊。

·大檔案(達63位檔案長度)在支援大檔案的檔案系統和作業系統上被支援。

·當把刪除和更新及插入混合的時候,動態尺寸的行更少碎片。這要通過合併相鄰被刪除的塊,以及若下乙個塊被刪除,就擴充套件到下一塊來自動完成。

·每個myisam表最大索引數是64。 這可以通過重新編譯來改變。每個索引最大的列數是16個。

·最大的鍵長度是1000位元組。這也可以通過編譯來改變。對於鍵長度超過250位元組的情況,乙個超過1024位元組的的鍵塊被用上。

·blob和text列可以被索引。

·null值被允許在索引的列中。這個佔每個鍵的0-1個位元組。

·所有數字鍵值以高位元組為先被儲存以允許乙個更高地索引壓縮。

·當記錄以排好序的順序插入(就像你使用乙個auto_increment列之時),索引樹被劈開以便高節點僅包含乙個鍵。這改善了索引樹的空間利用率。

·每表乙個auto_incremen列的內部處理。myisam為insert和update操作自動更新這一列。這使得auto_increment列更快(至少10%)。在序列頂的值被刪除之後就不能再利用。(當auto_increment列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。auto_increment值可用alter table或myisamch來重置。

·如果資料檔案中間的表沒有自由塊了,在其它執行緒從表讀的同時,你可以insert新行到表中。(這被認識為併發操作)。自由塊的出現是作為刪除行的結果,或者是用比當前內容多的資料對動態長度行更新的結果。當所有自由塊被用完(填滿),未來的插入又變成併發。

·你可以把資料檔案和索引檔案放在不同目錄,用data directory和index directory選項create table以獲得更高的速度。

·每個字元列可以又不同的字符集。

·在myisam索引檔案裡又乙個標誌,它表明表是否被正確關閉。如果用--myisam-recover選項啟動mysqld,myisam表在開啟得時候被自動檢查,如果被表被不恰當地關閉,就修復表。

·如果你用--update-state選項執行myisamchk,它標註表為已檢查。myisamchk --fast只檢查那些沒有這個標誌的表。

·myisamchk --analyze為部分鍵儲存統計資訊,也為整個鍵儲存統計資訊。

·myisampack可以打包blob和varchar列。

myisam也支援下列特徵:

·支援true varchar型別;varchar列以儲存在2個位元組中的長度來開始。

·有varchar的表可以有固定或動態記錄長度。

·varchar和char列可以多達64kb。

· 乙個被搞亂的已計算索引對可對unique來使用。這允許你在表內任何列的合併上有unique。(儘管如此,你不能在乙個unique已計算索引上搜尋)。

myisam啟動選項

下列對mysqld 的選項可用來改變myisam表的行為:

·--myisam-recover=mode

設定為崩潰myisam表自動恢復的模式。

·--delay-key-write=all

對任何myisam表的寫操作之間不要重新整理鍵緩衝區。

注釋:如果你要這麼做。當表在使用中之時,你應該不使用來自另乙個程式的myisam表(比如從另乙個mysql伺服器或用myisamchk)。這麼做會導致索引被破壞。

對使用--delay-key-write的表,使用--external-locking沒有幫助。

下列系統變數影響myisam表的行為:

·bulk_insert_buffer_size

用在塊插入優化中的樹緩衝區的大小。注釋:這是乙個per thread的限制。

·(obsolete) myisam_max_extra_sort_file_size

這個引數已經不在mysql中使用。

·myisam_max_sort_file_size

如果臨時檔案會變得超過索引,不要使用快速排序索引方法來建立乙個索引。注釋:這個引數以位元組的形式給出。

·myisam_sort_buffer_size

設定恢復表之時使用的緩衝區的尺寸。

如果用--myisam-recover選項啟動mysqld,自動恢復被啟用。在這種情況下,當伺服器開啟乙個myisam表之時,伺服器會檢查表是否被標註為崩潰,或者表的開啟計數變數是否不為0且你正用--skip-external-locking執行伺服器。如果這些條件的任何乙個為真,下列情況發生:

·表被查錯。

·如果伺服器發現乙個錯誤,它試著做快速表修復(排序且不重新建立資料檔案)。

·如果修復因為資料檔案中的乙個錯誤而失敗(例如,乙個重複鍵錯誤),伺服器會再次嘗試修復,這一次重建資料檔案。

·如果修復仍然失敗,伺服器用舊修復選項方法再重試一次修復(一行接一行地寫,不排序)。這個方法應該能修復任何型別的錯誤,並且需要很低的磁碟空間。

如果恢復不能夠從先前完成的語句裡恢復所有行,而且你不能在--myisam-recover選項值指定force,自動修復會終止,並在錯誤日誌裡寫一條錯誤資訊:

error: couldn't repair table: test.g00pages

如果你指定force,取而代之地,類似這樣的乙個警告被給出:

warning: found 344 of 354 rows when repairing ./test/g00pages

注釋:如果自動恢復值包括backup,恢復程序建立檔案並用tbl_name-datetime.bak形式取名。你應該有乙個cron指令碼,它自動把這些檔案從資料庫目錄移到備份媒質上。

鍵所需的空間

myisam表使用b型樹索引。你可以粗略地計算索引檔案的大小為(key_length+4)/0.67, 加上所有的鍵之和。當所有鍵以排序的順序插入並且表沒有任何壓縮的鍵之時,以上估計是對最壞的情況的。

字串索引是被空間壓縮的。如果第乙個字串索引部分是字串,它也被加字首壓縮。如果字串列有許多拖曳空間,或字串列是乙個總是不用完全長度的varchar列,空間壓縮使得索引檔案比最壞情況時的數值要小。字首壓縮被用在以字串開始的鍵上。如果有許多具有同一字首的字串,字首壓縮是有幫助的。

在myisam表,你也可以在建立表的時候通過指定pack_keys=1來字首壓縮數字。當數字被以高位元組優先儲存之時,若你有許多具有同一字首的整數鍵,上述方法是有幫助的。 

Mysql 儲存引擎之 MyISAM儲存引擎

myisam是預設儲存引擎。每個myisam在磁碟上儲存成三個檔案。frm檔案儲存表定義 myd檔案儲存資料 myi檔案儲存索引。要明確表示你想要用乙個myisam 請用engine表選項指出來 create table test myisam id int engine myisam 2 如下是m...

MySQL儲存引擎MyISAM與InnoDB的區別

一 innodb支援事務,myisam不支援,這一點是非常之重要。事務是一種高階的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而myisam就不可以了。二 myisam適合查詢以及插入為主的應用,innodb適合頻繁修改以及設計到安全性就高的應用 三 innodb支援外來鍵,myisam...

MySQL常用儲存引擎之MyISAM

1 mysql5.5之前版本使用的預設儲存引擎 2 myisam儲存引擎會將表存在兩個檔案系統中 myd和.myi結尾 副檔名 3 特性 併發性與鎖級別 表級別的鎖,併發性不足 表損壞修復 存在資料丟失 支援的索引型別 支援資料壓縮 myisampack b f table name.myi,會生成...