mysql——索引底層原理分析

一、區分幾個概念

1、頁

1、頁號:記錄當前是第幾頁。

2、頁目錄:記錄行數據,標記行開始的最小主鍵索引數據。

3、行數據:標識每一行的數據。1_111a 標識第一行數據,1_表示主鍵索引。

行與行數據使用鏈表有序相連。

4、一頁數默認爲16k,並且會指向下一頁的地址。

2、b+樹

多個頁相互連接在一起,爲了方便查找會再向上生成一個新的類似頁的東西,記錄頁碼和每頁最小的主鍵索引,按照這個思路就會生成一顆樹,這就是一個b+樹。

 

 

 

3、回表,如果是一個聚集索引(abc),在最下面的葉子節點存儲的不會是真實數據,而是對應的主鍵索引,所以如果查詢的時候查的數據並非abcd這四個字段,比如查詢的是abcde,就需要回表根據主鍵id繼續查詢。

select a,b,c,d,e from X where a=1 and b=2 and c=3 and d=e; 是不能利用索引的。

select a,b,c from X where a>1; 是不能利用索引的,因爲回表的話會全表掃描。

查詢過程會先查詢a=1,找到數據後查詢後續所有數據。

select a,b,c from X where a>7; 可能會利用索引,因爲mysql優化器認爲即使回表返回的數據不會很多,效率比全表掃描高一些。

 4、如何建立索引

    ① 索引選擇:選擇性 = 不重複的記錄數 / 總記錄數

       選擇性的取值範圍爲(0, 1],選擇性越高的索引價值越大。如果選擇性等於1,就代表這個列的不重複值和表記錄 數是一樣的,那麼對這個列建立索引是非常合適的,如果選擇性非常小,那麼就代表這個列的重複值是很多的, 不適合建立索引。

   ② 最左前綴原則

   ③ 1>索引列的類型儘量小

        2>利用索引字符串值的前綴

        3>主鍵自增

        4>定位並刪除表中的重複和冗餘索引

       5>儘量使用覆蓋索引進行查詢,避免回錶帶來的性能損耗。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章