首頁  >  文章  >  資料庫  >  Mysql-索引排序行的詳解

Mysql-索引排序行的詳解

黄舟
黄舟原創
2017-03-02 16:33:561492瀏覽

上一篇剛剛簡潔化的介紹了B-TREE的幾個結構與儲存方式,但索引和資料的關係感覺上還是沒有關聯起來,

那麼本篇,就透過實際的一個資料行的例子,創建索引後,他們在B+TREE上的排序是什麼順序。

一.模擬建立原始資料

#下圖中,左邊是自己方便說明,模擬的資料。引擎為mysiam~

右邊是用EXCEL把它們隨機排列後的一個正常模擬數據表,把主鍵按照1-27再排列(不隨機的話我在模擬數據時本來就是按順序寫的,再加索引看不大出這個索引排序的過程)

也就是說右邊的數據,使我們要測試的原始資料,沒建索引前是這樣排序的,後邊所有的資料都是以這個為依準進行的,這樣更好看索引產生後的排序效果。

此表有4個欄位(id,a,b,c),共27行資料



#2.建立索引a


#如下圖,當建立索引a以後,在這個索引結構中,從原來的依照主鍵ID排序,變成了新的規則,我們說索引其實就是一個資料結構。則建立索引a,就是新另建立一個結構,排序依照字段a規則排序,第一條為主鍵ID為1代表的資料行,第二條ID=3的資料行,第三條ID=5代表的數據行。 。 。

新排序主鍵ID

(以ID代表他們這行的資料):

1 3 5 6 9 16 18 23 26 2 10 11 12 13 14 15 20 25 4 7 8 17 19 21 22 24 27


不難發現,當欄位相同時,他們的排列前後主鍵ID來排,例如同樣是a=1.1的值,但是他們的排序是ID值為1,3,5,6。 。對應的行,和主鍵ID排序順序相近。

(即相同值時的排序,ID小的在前邊)


三.建立索引(a,b)

#######如下圖,當建立聯合索引(a,b)以後,在該索引結構中,從原來的按照主鍵ID排序,變成了新的規則,排序規則先按照字段a排序,在a的基礎上在按照字段b排序。即在索引a的基礎上,對字段b也進行了排序。 ##################

新排序主鍵ID(以ID代表他們這行的資料):6 18 23 10 15 20 7 22 27 1 3 26 2 11 25 4 8 24 5 9 16 12 13 14 17 19 21

#不難發現,當字段a,b值都相同時,他們的排列前後,也是由主鍵ID決定的,例如同樣是a=1.1,b=2.1的行(18,6,23),但是他們的排序是6,18,23。

欄位(a,b)索引,先依a索引排序,然後在a的基礎上,依照b排序

6 18 23 10 15 20 7 22 27 1 3 26 2 11 25 4 8 24 5 9 16 12 13 14 17 19 21








##。建立索引(a,b,c)


#欄位(a,b,c)索引,先按a,b索引排序,然後在(a,b)的基礎上,依照c排序

###############新排序主鍵ID #########(以ID代表他們這行的資料):######23 6 18 15 20 10 27 22 7 1 26 3 11 2 25 24 4 8 5 16 9 12 14 13 17 19 21######################## #########五。結論:#####################################和上一篇###Mysql-索引-BTree型【精簡】###講的一樣,B-TREE樹的最後一排葉子節點,從左往右排,就是按照這個順序的,不同索引不同順序。有了順序,那麼查找是不就方便快速的很多了嘛#########################我們知道,讀取資料的一個過程(相當於找房間的過程),如果有索引(房間登記表),先讀取索引的資料結構(因為它資料小讀取快嘛),在其結構的葉子節點,找到真實物理磁碟的存放位置(相當於找到門牌號碼了),然後拿著門牌號碼去磁碟裡直接拿數據,這就是一個讀取數據的過程。如果沒索引那你就相當於不知道目的地,就挨個房間找吧。 ############當沒有索引時,其實主鍵ID就是他們的索引,依照主鍵ID從小到大的規則排列;############當有所索引時,索引a,聯合索引(a,b),聯合索引(a,b,c)三者的對應3個B+TREE結構上,其葉子節點末尾指向的物理磁碟是是不一樣的。 ###########################結論:#########

1.如果沒有建立索引,是按照ID主鍵遞增排列

2.當建立了索引a,會產生一個新的結構索引(B+TREE )用來記錄新的一個結構規則,方便快速查找

3.當建立索引a,索引ab,索引abc,他們三個對應的資料排序是不一樣的

4.索引abc,是兼顧了索引ab,索引a的,所以有前者時後兩者可以不用建立

5.當建立了索引,非索引的欄位預設是依照ID遞增來排序的

 以上就是Mysql-索引排序行的詳解的內容,更多相關內容請關注PHP中文網(www. php.cn)!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn