The two most important days in your life are the day you were born and the day you find out why. -Mark Twain

#37 資料庫基礎 - Clustered Index 與 Non-clustered Index

在編號 #33 的文章中介紹了什麼是 Index.這可以說是資料庫對資料能快速尋找的主要方法,基本上也是一個用空間換取時間的方法,也就是為了更快速地找到資料,於是犧牲了更多的硬碟儲存空間來達成這件事.也因為如此,所以資料庫引擎也需要有相對應的功能來妥善管理這些特別的儲存空間.然而,儲存空間的內容不同也會影響不同的管理方法,所以這一篇文章將來介紹不同的儲存空間 -  Clustered Index 和 Non-clustered Index.

如果你曾撰寫過資料庫應用的相關程式或是你本身是資料庫管理員,相信你一定聽過 Clustered Index 和 Non-clustered Index.這兩個 Index 有什麼不同呢 ? 給一個比較簡單直覺的答案就是 Clustered Index 是根據某個資料在儲存空間上排列的順序而建立,而 Non-clustered Index 不一定要按照實體的資料排列順序而建立.

把 #33 那篇文章中的圖片再貼過來一次.


之前提過這是一份資料,按照學生證號碼排列寫入儲存空間的概念圖,所以你可以看到學生證的號碼有 1,5,7,11,13,16,23,24,36 這些號碼,而這些號碼基本上會被選做為 primary key,所以資料庫引擎可以利用這個號碼做為資料儲存位置的順序.因此,號碼小的一定寫在號碼大的前面,若不是在同一個 page 上的話,那一定是在前面的 page 上.所以,如果資料庫引擎用學生證號碼做為依據來建立 Index 的話,它的 Index tree 就有如上圖所承現.這一個 Index tree 我們就稱為 Clustered Index,也就是這個 Index 是依據決定實體順序排列的資料而建立起來的.其他種類的 Index 就稱為 Non-clustered Index.

所以,你就能知道為什麼在建立 Clustered Index 的時候你只能建立一個,而 Non-clustered Index 可以建立好多個,那就是因為實體順序排列只會有一種.

在尋找資料時,Index 特別強大的功能是在於某一個範圍內的尋找,比如,你要找學生證號碼 5 號的資料,或是找學生證號碼大於 20 號的資料.這類型的範圍尋找對使用 Index 來說是最好的.而 Clustered Index 和 Non-clustered Index 在這方面又有什麼差別呢 ? Clustered Index 的建立是依據資料實體的排列順序,所以當你執行了一個 SQL command 如 select * from students where ( ID < 10 and ID >0) ,你就會發現這只需要讀取一個 page 而己,這是以上圖為例子.如果你執行了另一個 SQL command 如 select * from students where street = '1st',假設有一個 Non-clustered Index 是根據 street 資料而建立的,所以當你要尋找 street = 1st 時,這一個 Non-clustered Index 就會被用到,而且很有可能會指到許多不同的 page,比如 1 號學生和 36 號學生都住在 1st street.所以,Clustered Index 的尋找所需要讀取的 page 數量理論上會小於或等於 Non-clustered Index 所需要讀取的 page 數量.

總結,對資料庫引擎而言,不論是 Clustered Index 或是 Non-clustered Index,尋找資料的過程基本上都是一樣的,由於這兩種 Index 的特性不同,所以造成 Clustered Index 所帶來的維護成本較高 (因為實體的儲存順序就是 Index 上資料的順序,要變動比較麻煩),而 Non-clustered Index 所帶來的維護成本相對較低 (因為只要改 pointer 指到新的 page).

Share:

0 意見:

張貼留言