Myisam-儲存引擎-MYI索引檔案-2

Steven1981發表於2009-03-11
進一步一剖析MYI索引檔案的樹形結構儲存以及索引塊的定位[@more@]
1. 緒
我們在上一節中,仔細地探討了索引檔案的結構以及各位的含義.從而讓我們瞭解了MYI.
但是用的例子由於行數比較少, 所有KEY VALUE都儲存到了ROOT塊. 沒有出現多層的索引樹結構.
透過這個例子,我們來了解一下,當有索引樹出現多層的時候,MYSQL是怎麼處理的.
2. 建立指令碼:
drop table if exists heyf ;
create table heyf (id char(5)) type myisam DEFAULT CHARSET=latin1;
drop procedure if exists proc1;
delimiter $$
create procedure proc1()
begin
declare v_cnt int default 0;
loop1:loop
set v_cnt := v_cnt+1;
if v_cnt=200 then leave loop1 ;
end if;
insert into heyf values (v_cnt) ;
end loop loop1;
end;
$$
delimiter ;
call proc1();
create index id_ind on heyf(id) ;
3. dump MYI 檔案
system hexdump /opt/mysql/data/test/heyf.MYI
---------------------------------------------------
0000000 fefe 0107 0200 5401 b000 6400 c400 0100
0000010 0000 0001 0108 0000 0000 ff30 0000 0000
0000020 0000 c700 0000 0000 0000 0000 0000 0000
0000030 0000 c700 ffff ffff ffff ffff 0000 0000
0000040 0000 0014 0000 0000 0000 7105 0000 0000
0000050 0000 0000 0000 0000 0000 0000 0000 0000
0000060 0000 0000 0000 0000 0000 0000 0000 5e3c
0000070 0000 3e00 0000 0000 0000 0100 0000 0000
0000080 0000 0010 ffff ffff ffff ffff 0000 0000
0000090 0000 0000 b749 f24d 0000 0000 0000 0100
00000a0 0000 0000 b749 f24d 0000 0000 0000 0000
00000b0 0000 0000 b749 f24d 0000 0000 0000 c700
00000c0 0000 0100 0000 0000 0000 0004 0000 0000
00000d0 0000 0000 0000 0000 0000 0000 0000 0000
*
00000f0 0000 0600 0000 0700 0000 0600 0000 0600
0000100 0000 1400 0000 0200 0000 0000 0606 0001
0000110 0000 0000 0004 1000 0000 0000 0000 0000
0000120 0000 0000 0000 0000 0101 4800 0004 0c00
0000130 0c00 0c00 0801 0002 0000 1000 0500 0000
0000140 0100 0000 0000 0000 0100 0000 0000 0000
0000150 0205 0000 0000 0000 0000 0000 0000 0000
0000160 0000 0000 0000 0000 0000 0000 0000 0000
*
0000400 f203 3101 2020 2020 0000 0000 0000 3101
0000410 2030 2020 0000 0000 0900 3101 3030 2020
0000420 0000 0000 6300 3101 3130 2020 0000 0000
0000430 6400 3101 3230 2020 0000 0000 6500 3101
0000440 3330 2020 0000 0000 6600 3101 3430 2020
0000450 0000 0000 6700 3101 3530 2020 0000 0000
0000460 6800 3101 3630 2020 0000 0000 6900 3101
0000470 3730 2020 0000 0000 6a00 3101 3830 2020
0000480 0000 0000 6b00 3101 3930 2020 0000 0000
0000490 6c00 3101 2031 2020 0000 0000 0a00 3101
00004a0 3031 2020 0000 0000 6d00 3101 3131 2020
00004b0 0000 0000 6e00 3101 3231 2020 0000 0000
00004c0 6f00 3101 3331 2020 0000 0000 7000 3101
00004d0 3431 2020 0000 0000 7100 3101 3531 2020
00004e0 0000 0000 7200 3101 3631 2020 0000 0000
00004f0 7300 3101 3731 2020 0000 0000 7400 3101
0000500 3831 2020 0000 0000 7500 3101 3931 2020
0000510 0000 0000 7600 3101 2032 2020 0000 0000
0000520 0b00 3101 3032 2020 0000 0000 7700 3101
0000530 3132 2020 0000 0000 7800 3101 3232 2020
0000540 0000 0000 7900 3101 3332 2020 0000 0000
0000550 7a00 3101 3432 2020 0000 0000 7b00 3101
0000560 3532 2020 0000 0000 7c00 3101 3632 2020
0000570 0000 0000 7d00 3101 3732 2020 0000 0000
0000580 7e00 3101 3832 2020 0000 0000 7f00 3101
0000590 3932 2020 0000 0000 8000 3101 2033 2020
00005a0 0000 0000 0c00 3101 3033 2020 0000 0000
00005b0 8100 3101 3133 2020 0000 0000 8200 3101
00005c0 3233 2020 0000 0000 8300 3101 3333 2020
00005d0 0000 0000 8400 3101 3433 2020 0000 0000
00005e0 8500 3101 3533 2020 0000 0000 8600 3101
00005f0 3633 2020 0000 0000 8700 3101 3733 2020
0000600 0000 0000 8800 3101 3833 2020 0000 0000
0000610 8900 3101 3933 2020 0000 0000 8a00 3101
0000620 2034 2020 0000 0000 0d00 3101 3034 2020
0000630 0000 0000 8b00 3101 3134 2020 0000 0000
0000640 8c00 3101 3234 2020 0000 0000 8d00 3101
0000650 3334 2020 0000 0000 8e00 3101 3434 2020
0000660 0000 0000 8f00 3101 3534 2020 0000 0000
0000670 9000 3101 3634 2020 0000 0000 9100 3101
0000680 3734 2020 0000 0000 9200 3101 3834 2020
0000690 0000 0000 9300 3101 3934 2020 0000 0000
00006a0 9400 3101 2035 2020 0000 0000 0e00 3101
00006b0 3035 2020 0000 0000 9500 3101 3135 2020
00006c0 0000 0000 9600 3101 3235 2020 0000 0000
00006d0 9700 3101 3335 2020 0000 0000 9800 3101
00006e0 3435 2020 0000 0000 9900 3101 3535 2020
00006f0 0000 0000 9a00 3101 3635 2020 0000 0000
0000700 9b00 3101 3735 2020 0000 0000 9c00 3101
0000710 3835 2020 0000 0000 9d00 3101 3935 2020
0000720 0000 0000 9e00 3101 2036 2020 0000 0000
0000730 0f00 3101 3036 2020 0000 0000 9f00 3101
0000740 3136 2020 0000 0000 a000 3101 3236 2020
0000750 0000 0000 a100 3101 3336 2020 0000 0000
0000760 a200 3101 3436 2020 0000 0000 a300 3101
0000770 3536 2020 0000 0000 a400 3101 3636 2020
0000780 0000 0000 a500 3101 3736 2020 0000 0000
0000790 a600 3101 3836 2020 0000 0000 a700 3101
00007a0 3936 2020 0000 0000 a800 3101 2037 2020
00007b0 0000 0000 1000 3101 3037 2020 0000 000001
00007c0 a900 3101 3137 2020 0000 0000 aa00 3101
00007d0 3237 2020 0000 0000 ab00 3101 3337 2020
00007e0 0000 0000 ac00 3101 3437 2020 0000 0000
00007f0 ad00 0000 0000 0000 0000 0000 0000 0000
0000800 f203 3101 3637 2020 0000 0000 af00 3101
0000810 3737 2020 0000 0000 b000 3101 3837 2020
0000820 0000 0000 b100 3101 3937 2020 0000 0000
0000830 b200 3101 2038 2020 0000 0000 1100 3101
0000840 3038 2020 0000 0000 b300 3101 3138 2020
0000850 0000 0000 b400 3101 3238 2020 0000 0000
0000860 b500 3101 3338 2020 0000 0000 b600 3101
0000870 3438 2020 0000 0000 b700 3101 3538 2020
0000880 0000 0000 b800 3101 3638 2020 0000 0000
0000890 b900 3101 3738 2020 0000 0000 ba00 3101
00008a0 3838 2020 0000 0000 bb00 3101 3938 2020
00008b0 0000 0000 bc00 3101 2039 2020 0000 0000
00008c0 1200 3101 3039 2020 0000 0000 bd00 3101
00008d0 3139 2020 0000 0000 be00 3101 3239 2020
00008e0 0000 0000 bf00 3101 3339 2020 0000 0000
00008f0 c000 3101 3439 2020 0000 0000 c100 3101
0000900 3539 2020 0000 0000 c200 3101 3639 2020
0000910 0000 0000 c300 3101 3739 2020 0000 0000
0000920 c400 3101 3839 2020 0000 0000 c500 3101
0000930 3939 2020 0000 0000 c600 3201 2020 2020
0000940 0000 0000 0100 3201 2030 2020 0000 0000
0000950 1300 3201 2031 2020 0000 0000 1400 3201
0000960 2032 2020 0000 0000 1500 3201 2033 2020
0000970 0000 0000 1600 3201 2034 2020 0000 0000
0000980 1700 3201 2035 2020 0000 0000 1800 3201
0000990 2036 2020 0000 0000 1900 3201 2037 2020
00009a0 0000 0000 1a00 3201 2038 2020 0000 0000
00009b0 1b00 3201 2039 2020 0000 0000 1c00 3301
00009c0 2020 2020 0000 0000 0200 3301 2030 2020
00009d0 0000 0000 1d00 3301 2031 2020 0000 0000
00009e0 1e00 3301 2032 2020 0000 0000 1f00 3301
00009f0 2033 2020 0000 0000 2000 3301 2034 2020
0000a00 0000 0000 2100 3301 2035 2020 0000 0000
0000a10 2200 3301 2036 2020 0000 0000 2300 3301
0000a20 2037 2020 0000 0000 2400 3301 2038 2020
0000a30 0000 0000 2500 3301 2039 2020 0000 0000
0000a40 2600 3401 2020 2020 0000 0000 0300 3401
0000a50 2030 2020 0000 0000 2700 3401 2031 2020
0000a60 0000 0000 2800 3401 2032 2020 0000 0000
0000a70 2900 3401 2033 2020 0000 0000 2a00 3401
0000a80 2034 2020 0000 0000 2b00 3401 2035 2020
0000a90 0000 0000 2c00 3401 2036 2020 0000 0000
0000aa0 2d00 3401 2037 2020 0000 0000 2e00 3401
0000ab0 2038 2020 0000 0000 2f00 3401 2039 2020
0000ac0 0000 0000 3000 3501 2020 2020 0000 0000
0000ad0 0400 3501 2030 2020 0000 0000 3100 3501
0000ae0 2031 2020 0000 0000 3200 3501 2032 2020
0000af0 0000 0000 3300 3501 2033 2020 0000 0000
0000b00 3400 3501 2034 2020 0000 0000 3500 3501
0000b10 2035 2020 0000 0000 3600 3501 2036 2020
0000b20 0000 0000 3700 3501 2037 2020 0000 0000
0000b30 3800 3501 2038 2020 0000 0000 3900 3501
0000b40 2039 2020 0000 0000 3a00 3601 2020 2020
0000b50 0000 0000 0500 3601 2030 2020 0000 0000
0000b60 3b00 3601 2031 2020 0000 0000 3c00 3601
0000b70 2032 2020 0000 0000 3d00 3601 2033 2020
0000b80 0000 0000 3e00 3601 2034 2020 0000 0000
0000b90 3f00 3601 2035 2020 0000 0000 4000 3601
0000ba0 2036 2020 0000 0000 4100 3601 2037 2020
0000bb0 0000 0000 4200 3601 2038 2020 0000 0000
0000bc0 4300 3601 2039 2020 0000 0000 4400 3701
0000bd0 2020 2020 0000 0000 0600 3701 2030 2020
0000be0 0000 0000 4500 3701 2031 2020 0000 0000
0000bf0 4600 0000 0000 0000 0000 0000 0000 0000
0000c00 5e01 3701 2033 2020 0000 0000 4800 3701
0000c10 2034 2020 0000 0000 4900 3701 2035 2020
0000c20 0000 0000 4a00 3701 2036 2020 0000 0000
0000c30 4b00 3701 2037 2020 0000 0000 4c00 3701
0000c40 2038 2020 0000 0000 4d00 3701 2039 2020
0000c50 0000 0000 4e00 3801 2020 2020 0000 0000
0000c60 0700 3801 2030 2020 0000 0000 4f00 3801
0000c70 2031 2020 0000 0000 5000 3801 2032 2020
0000c80 0000 0000 5100 3801 2033 2020 0000 0000
0000c90 5200 3801 2034 2020 0000 0000 5300 3801
0000ca0 2035 2020 0000 0000 5400 3801 2036 2020
0000cb0 0000 0000 5500 3801 2037 2020 0000 0000
0000cc0 5600 3801 2038 2020 0000 0000 5700 3801
0000cd0 2039 2020 0000 0000 5800 3901 2020 2020
0000ce0 0000 0000 0800 3901 2030 2020 0000 0000
0000cf0 5900 3901 2031 2020 0000 0000 5a00 3901
0000d00 2032 2020 0000 0000 5b00 3901 2033 2020
0000d10 0000 0000 5c00 3901 2034 2020 0000 0000
0000d20 5d00 3901 2035 2020 0000 0000 5e00 3901
0000d30 2036 2020 0000 0000 5f00 3901 2037 2020
0000d40 0000 0000 6000 3901 2038 2020 0000 0000
0000d50 6100 3901 2039 2020 0000 0000 6200 0000
0000d60 0000 0000 0000 0000 0000 0000 0000 0000
*
0001000 2c80 0000 0000 0100 3101 3537 2020 0000
0001010 0000 ae00 0000 0000 0200 3701 2032 2020
0001020 0000 0000 4700 0000 0000 0300 0000 0000
0001030 0000 0000 0000 0000 0000 0000 0000 0000
-----------------------------------------------------
4. 快速讀取MYI檔案
透過上一節的學習,我們雖然知道各位資料的意義 ,但由於引數太多,這裡把經常讀取的資料位置列一下:
KEYS : 索引的個數, 0X13,1個位元組.
KEY ROOT : 索引的ROOT地址, 0X7C開始, 每個ROOT地址佔8個位元組 ;
如果地址0X13顯示有多個索引的話,那麼0X7C開始就有多個ROOT地址;
在上例地址為: 0000 0000 0000 1000
HEADER LENGTH : 索引檔案HEADER長度, 0X07,0X06,兩個位元組
一般索引檔案頭結束,下面就是具體的索引塊.但緊跟著HEADER的不一定是ROOT塊
KEY START : 索引塊起始地址, 記錄在HEADER->BASE的第一個8位元組. (HEADER->BASE的起始地址記錄在:0X0D,0X0C)
BLOCK SIZE : 索引塊大小: 1024B
KEY RECORD LENGTH = Pointer + KEY SIZE

POINTER LENGTH = 定長: 4B (如果行數超過2**32,則需要更多位)
變長: 由於存的是檔案的偏移量, 檔案<=4G,則4位,如果資料檔案>4G,則需要更多位
KEY SIZE = 根據KEY的長度+1B分隔符


5. 分析本例中的"枝"與"葉"
由於索引塊的大小為1024,為了讓索引能產生葉和枝,本例造了200個CHAR(5)的資料.
首先得到KEY ROOT ,在例中, 0X7C後的8個位元組為: 0000 0000 0000 1000
我們從上面的資料中讀取地址 00001000後的一個塊:
----------------------------------------------
0001000 2c80 0000 0000 0100 3101 3537 2020 0000
0001010 0000 ae00 0000 0000 0200 3701 2032 2020
0001020 0000 0000 4700 0000 0000 0300 0000 0000
0001030 0000 0000 0000 0000 0000 0000 0000 0000
-----------------------------------------------
先將ROOT塊資料分列一下:
-----------------------------------------
802c --&gt 1 0000000 00101100 --&gt FLAG(1位,1代表是枝),索引塊的長度(15位,0x2c=>46B)
00 00 00 00 00 01 01 31 37 35 20 20 00 00 00 00 00 ae
00 00 00 00 00 02 01 37 32 20 20 20 00 00 00 00 00 47
00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00
---------------------------------------------------------
看第一行:
---------------------------------------------------------
00 00 00 00 00 01 : 6個位元組,大於該鍵值的KEY所在索引塊序列號,索引塊從0000 0000 0000開始編號.
01 31 37 35 20 20 00 00 : 8個位元組,具體的KEY VALUE,"175__"
00 00 00 ae : 4個位元組,在MYD檔案中的POINTER.

---------------------------------------------------------
注意,由於"175__"這個KEY在ROOT有儲存,他在其他索引塊就不再儲存了.
關於索引的搜尋方法,我想應該於ORACLE大致一樣:
比如,在本例中,等值搜尋"24":
1) 先在枝塊搜尋第一個>="搜尋值"的KEY, (上例中會找到第二行記錄"24"2) 如果枝塊上的KEY VALUE = "搜尋值" , 返回結果,結束
3) 如果枝塊上的KEY VALUE > "搜尋值" , 找到該枝塊上前一行記錄,取得索引塊的序號: 00 00 00 00 00 01
3) 根據索引塊序號,取得一整個索引塊,塊內搜尋.
4) 返回結果.
在這裡我們發現MYISAM的索引塊沒有指向下一個索引塊的POINTER, 那麼如果是RANGE訪問.將透過枝塊來定位到每一個索引塊.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/703656/viewspace-1018471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章