周末終于搬進出租房了,裝了寬帶。。。。才發現沒網的日子。。。那是一個怎樣的與世隔絕呀。。。再也受不了那樣的日子了。。。。好了,既然網
安上去了,還得繼續我的這個系列。
索引和鎖,這兩個主題對我們開發工程師來說,非常的重要。。。隻有了解了這兩個主題,我們才能寫出高品質的sql語句,在之前的部落格中,我所說的
索引都是單列索引。。。當然資料庫不可能隻認單列索引,還有我這篇的複合索引,說到複合索引,可能熟悉的人又會說到include索引,那這兩個索引到底
有什麼差別呢,當然我也是菜鳥一枚。。。是以下面的也是我的個人見解。。。
一:從資料頁角度看問題
1. 做兩個表,插入兩條資料,在test1上做複合索引,在test2上做include索引,如下圖:
2. 然後通過DBCC 指令檢視資料頁記錄
<1> 先來看看test1表中各個槽位的資訊
<2> 再來看看test2表中各個槽位資訊
<3> 從test1和test2的資料頁來看,都是有兩個slot槽位,然後我們把test1和test2的slot0槽位拿出來對比下,是不是就知道兩者大概有什麼差別了。
test1のslot0
test2のslot0
下面我仔細解剖下兩表中的slot内容:
16 6161616161 3131314071712e636f6d c0000000 0100 0000 0300 00
16: 這個是索引記錄的系統頭資料。
6161616161: 轉換成十進制就是9797979797,也就是字元的aaaaa。
3131314071712e636f6d: 這個我想你也懂,也就是[email protected]。
c000000010000000: 因為我們是堆表,是以這個就是表的RowID,轉化為十進制就是: 192:1:0。
0300: 這個表示表中的記錄數,也就是3條記錄。
如果你對上面的講解明白了,那我們繼續看看test2のslot0,如果你仔細的話,你會看到在test2中,111qq.com是在記錄的最後。。。那這說明什
麼問題呢???如果你對記錄比較熟悉的話,你就知道,其實記錄中的變長字段值一般都是放在記錄的尾部。。。好處就是可以做到“行溢出”。也就是
可以超過索引的900長度限制。。。而複合索引卻無法做到。。。如果你不信我可以做個例子,将name和email的長度設為定長500。
而include索引卻可以順利通過。。。。。
這幾天上海特别冷,打字都打着手哆嗦。。。不準備繼續說了。。。下一篇繼續扯下複合索引到底都能帶來哪些好處。