MySQL 聚集索引/非聚集索引簡述
MySQL索引中可以分為聚集索引與非聚集索引兩類,在網路上也見過聚簇的說法,這裡先簡單介紹兩種索引的含義與適用場景。懶得畫圖,全是字。
聚集索引
索引的鍵值邏輯順序決定了表資料行的物理儲存順序,也就是在資料庫上連線的記錄在磁碟上的物理儲存地址也是相鄰的,注意這一點特性,我們可以分析出它的適用情況。由於聚集索引規定了資料項,也可以說是記錄在表中的物理儲存順序,物理順序唯一,自然每張表中的聚集索引也是唯一的,但是它可以包含多個列,多個欄位。
聚集索引類似於新華字典中用拼音去查詢漢字,拼音檢索表於書記順序都是按照a~z排列的,就像相同的邏輯順序於物理順序一樣,當你需要查詢a,ai兩個讀音的字,或是想一次尋找多個傻(sha)
的同音字時,也許向後翻幾頁,或緊接著下一行就得到結果了。
進一步來說,當你需要查詢的資料經常被分組看待(分類),或是經常查詢範圍性的資料(本月,本週總結),不同值的小數目等情況時,可以使用聚集索引。
非聚集索引
自然,非聚集索引也就是儲存的鍵值邏輯連續,但是在表資料行物理儲存順序上不一定連續的索引,也就是索引的邏輯順序與磁碟上的物理儲存順序不同。
非聚集索引類似在新華字典上通過偏旁部首來查詢漢字,檢索表也許是按照橫、豎、撇來排列的,但是由於正文中是a~z的拼音順序,所以就類似於邏輯地址於物理地址的不對應。同時適用的情況就在於分組,大數目的不同值,頻繁更新的列中,這些情況即不適合聚集索引。
某些情況下索引與物理儲存邏輯有關:
其中存在一種情況,MySQL的MyISAM引擎B+樹式的儲存結構,把葉子結點上存放的並不是資料本身,而是存放資料的地址,所以在使用索引時,例如主索引、輔助索引有時達不到想要的效果,而且都是非聚集索引。
對於主鍵
主鍵不一定適合加上聚集索引,有時甚至是一種對這個唯一的聚集索引的浪費(雖然在SQLServer中主鍵預設為聚集索引),並非在任何欄位上加上聚集/非聚集索引都能提高查詢效率。下面我們結合實際情況分析。
建立”索引”的利與弊
優勢:
- 能夠保證資料每一行的唯一性
- 合理運用時加快資料的查詢速度
- 增強表與表之間的連結,參考完整性
- 減少分組、排序等操作的查詢時間
- 優化查詢過程,提高系統性能
弊端:
- 建立、維護索引的時間會隨著資料量的增加而增加
- 自然,索引也是需要佔據物理空間的
- 增刪改查資料的時候,也會由於索引的存在而增加時間,類似於多了一個屬性,也會降低表更新的速度
總而言之,這只是MySQL查詢時優化速度等方面的冰山一角,還是需要多分析,多考慮,根據實際情況去選擇各種輔助功能的使用,才能得到相對最高的效率。