myisam增刪改查過程學習

2021-08-20 15:21:36 字數 2927 閱讀 7737

myisam引擎

*myisam引擎的索引與資料分開儲存,分別儲存為.myi和.myd。每個表只有乙個myi檔案,因而該錶所有的索引都儲存在這個檔案中,索引檔案由五個部分組成:state,base,keydef,recinfo以及key blocks。

state儲存在檔案最前面,主要的用途是標明索引檔案的狀態,比如包括幾個索引,其根指標為多少,當前索引檔案大小等。其中一些重要的引數如下:options表明行格式是固定的還是動態長度還是壓縮的,這對索引檔案儲存的指向資料的『指標『型別有影響,header_length表明前面四個部分元資料的長度,state_info_length和base_info_length表明state和base的長度,keys表明有多少個索引在該檔案中,open_count統計該錶被開啟次數,records表明有多少記錄,del表明有多少記錄標記刪除,key_file_length,data_file_length表明myi和myd檔案大小,key_root表明索引根指標,有多少個索引這兒就有幾個指標順序排列。

base儲存在state後面,主要是儲存一些myi檔案的定義,max_data_file_length和max_key_file_length表明myi和myd檔案的最大大小,max_key_block_length表明乙個塊的大小,max_key_length表明乙個索引鍵值最大大小。

keydef主要是形容索引的具體構造,有幾個索引這兒就有幾個keydef順序排列,keysegs表明該索引就幾個列,key_alg表明索引資料結構是b樹還是r樹,keylength表明索引鍵長度。

當行記錄長度固定時,索引檔案中儲存的指向資料的指標是行號,只需要將行號乘以每行長度就可以找到對應的資料;如果行長度是動態的,則指標是資料檔案中offset,通過offset可以在資料檔案中定位具體資料位置。可以看出固定長度的行容易維護的多,動態長度行容易造成碎片,比如說一行記錄刪除後重新插入一條很短的資料,那麼後面一部分就浪費,又或者插入一段超出原來長度的行記錄,那麼需要將行**,通過乙個指標來只想另一部分的行記錄。動態行格式一般是因為表中有varchar,varbinary,text和blob等動態長度的資料結構導致的。

因為資料和索引檔案的分離,所以在大量資料插入的時候可以選擇deley

_key_write甚至先關閉一段時間的索引更新來提高插入速度,dely_key_write將會將更改過的鍵快取在鍵緩衝中,而不是第一時間重新整理到硬碟,而是在mysql關閉的時候再統一重新整理到硬碟。而資料檔案其實是就是一行行記錄的順序排列,其插入規則就是如果資料檔案有被刪除的空隙,則插入空隙,如果沒有則插入到資料檔案最後,當設定為concurrent insert的時候則根據選項沒空隙的時候插入最後面或者強制插入最後面而不管是否有空隙。因為myisam這種資料檔案的管理方式因而即使使用了delay_key_write並且伺服器宕機了,依然可以根據資料檔案重建索引。由於這種特性,如果是單執行緒插入的話,myisam的效能應該是要高於innodb很多的,不過在多執行緒插入下myisam由於表級鎖限制就慢很多了,此外innodb提供的資料完整性,事務等特性是myisam沒有的,比如說myisam資料的插入讀取都是交給作業系統的,插入一條資料如果作業系統還把他快取在系統緩衝中,那麼系統宕機後資料就丟失了而這對於myisam是透明的,所以myisam保證不了資料完整性。

索引的資料結構為b樹和r樹,r樹好像使用不多就不說了,使用b數的索引有普通索引和全文索引。兩者的資料結構沒什麼區別,分為非葉子節點和葉子節點,乙個節點大小一般為1024位元組,非葉子節點儲存鍵值,資料和指標指向下乙個節點,葉子結點儲存鍵值和資料。兩者的不同是普通索引的鍵值由索引列構造,而全文索引的鍵值則是關鍵字,生成全文索引時根據分詞結果分出單個單詞,然後根據停用列表,ft_min_word_len,ft_max_word_len等過濾掉一部分單詞,其餘的詞用作關鍵字作為鍵值,每個鍵值的資料儲存的是指向出現這些關鍵字的行記錄的指標。全文索引效率不高,即使全部讀入記憶體,一條100個單詞的句子插入仍然需要更新全文索引100次。

需要注意的是由於myisam是表級鎖,因而一般來講增刪查改這四個操作是不能同時對乙個表進行的,除了設定了concurrent insert,可以進行併發插入。

查詢過程

*對於myisam緩衝只快取索引,一般來講需要盡量把資料庫中所有myisam表的索引都緩衝進記憶體中,不過查詢的時候該錶索引不在記憶體中,還需要耗費時間去硬碟讀取,myisam查詢時根據執行計畫給定的行定位條件查詢鍵緩衝,根據鍵緩衝中儲存的行記錄指標去資料檔案進行硬碟io讀取資料,需要注意的是得到後行記錄指標,讀取資料是交由給作業系統進行io的,也許需要查詢的行記錄正好存在於作業系統緩衝,那麼速度會快上很多,不過這一切對於myisam都是透明的不可控的,作業系統根據指標(也就是行號或者offset)去資料檔案定位到具體的行記錄位置讀取並返回給myisam,myisam將查詢的所有資料整理後交給server層進行進一步處理(比如繼續where條件過濾)。

插入過程

*myisam插入資料對於索引和資料來說是分離的,即索引的更新不影響資料的插入。每當有新資料交由myisam插入的時候,資料的插入都是直接插入空隙或者檔案最後,這些前面講過就不再贅述。而索引的更新則根據引數設定有所不同,如果關閉了索引,那麼插入資料時不會更新索引,直到重新開啟了索引才會根據資料檔案重建索引檔案。如果開啟了delay_key_write那麼雖然會在記憶體中更新,但是只會在mysql關閉的時候重新整理進硬碟,如果沒有設定該引數,那麼每次更新鍵緩衝都會重新整理到硬碟,這對於效能影響比較大,一般來講還是建議開啟delay key write。

更新過程

*更新操作先根據鍵緩衝查詢需要更改的記錄指標,然後在資料檔案找到對應行記錄進行修改即可,這裡需要注意的是如果行格式是動態長度,那麼新插入的資料如果需要插入空隙並且要大於原空隙長度,那麼就可能造成行記錄的**,會有乙個指標指向另一部分行記錄的位置。

刪除過程

*刪除過程類似更新過程,不過需要注意的是並不是真正的物理刪除,而是僅僅在行記錄第乙個bit修改標記,從而後續插入的資料就可以直接插入到這裡。

MyIbatis 儲存過程 增,刪,改,查

參考資料 1 ibatis3.0儲存過存的一些細節 url 2 ibatis3.x如何呼叫oracle儲存過程定義的in陣列 url 3 ibatis3呼叫儲存過程 url 4 ibatis2.0與ibatis3.0 呼叫儲存過程 sql url color red 對於myibatis呼叫儲存過程...

oracle學習(一) 增刪改查

資料庫,是從檔案系統公升級過來的一種儲存形式,最常用的和對普通的用法就是增刪改查。最初在學校學習資料庫的時候感覺不是特別的難,當然只是從簡單實用的角度。現在在工作的時候,難免還是需要對自己已經掌握的只是進行整理和提公升,尤其是有的時候,自己的基本功還不是特別的紮實。查詢 select from us...

MySQL學習筆記 增刪改查

有關資料庫的dml操作 insert into delete truncate update select 條件查詢 查詢排序 聚合函式 分組查詢 drop truncate delete delete刪除資料,保留表結構,可以回滾,如果資料量大,很慢,回滾就是因為備份刪除的資料 truncate刪...