成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)庫索引融會貫通

chanthuang / 570人閱讀

摘要:索引的各種規(guī)則紛繁復雜,不了解索引的組織形式就沒辦法真正地理解數(shù)據(jù)庫索引。順暢地閱讀這篇文章需要了解索引聯(lián)合索引聚集索引分別都是什么,如果你還不了解,可以通過另一篇文章來輕松理解數(shù)據(jù)庫索引是什么新華字典來幫你。

索引的各種規(guī)則紛繁復雜,不了解索引的組織形式就沒辦法真正地理解數(shù)據(jù)庫索引。通過本文,你可以深入地理解數(shù)據(jù)庫索引在數(shù)據(jù)庫中究竟是如何組織的,從此以后索引的規(guī)則對于你將變得清清楚楚、明明白白,再也不需要死記硬背。

順暢地閱讀這篇文章需要了解索引、聯(lián)合索引聚集索引分別都是什么,如果你還不了解,可以通過另一篇文章來輕松理解——數(shù)據(jù)庫索引是什么?新華字典來幫你。

這篇文章是一系列數(shù)據(jù)庫索引文章中的第二篇,這個系列包括了下面四篇文章:

數(shù)據(jù)庫索引是什么?新華字典來幫你 —— 理解

數(shù)據(jù)庫索引融會貫通 —— 深入

20分鐘數(shù)據(jù)庫索引設計實戰(zhàn) —— 實戰(zhàn)

數(shù)據(jù)庫索引為什么用B+樹實現(xiàn)? —— 擴展

這一系列涵蓋了數(shù)據(jù)庫索引從理論到實踐的一系列知識,一站式解決了從理解到融會貫通的全過程,相信每一篇文章都可以給你帶來更深入的體驗。

索引的組織形式

通過之前的內(nèi)容,我們已經(jīng)對數(shù)據(jù)庫索引有了相當程度的抽象了解,那么在數(shù)據(jù)庫中,索引實際是以什么樣的形式進行組織的呢?同一張表上的多個索引又是怎樣分工合作的呢?

目前絕大多數(shù)情況下使用的數(shù)據(jù)庫索引都是使用B+樹實現(xiàn)的,下面就以MySQL的InnoDB為例,介紹一下數(shù)據(jù)庫索引的具體實現(xiàn)。

聚集索引

下面是一個以B+樹形式組織的拼音索引,在B+樹中,每一個節(jié)點里都有N個按順序排列的值,且每個值的中間和節(jié)點的頭尾都有指向下一級節(jié)點的指針。在查找過程中,按順序從頭到尾遍歷一個節(jié)點中的值,當發(fā)現(xiàn)要找的目標值恰好在一個指針的前一個值之前、后一個值之后時,就通過這個指針進入下一級節(jié)點。當最后到達葉子節(jié)點,也就是最下層的節(jié)點時,就能夠找到自己希望查找的數(shù)據(jù)記錄了。

在上圖中如果希望找到字,那么我們首先通過拼音首字母在根節(jié)點上按順序查找到了XY之間的指針,然后通過這個指針進入了第二級節(jié)點···, xia, xian, xiang, ···。之后在該節(jié)點上找到了xianxiang之間的指針,這樣就定位到了第519頁開始的一個目標數(shù)據(jù)塊,其中就包含了我們想要找到的字。

因為拼音索引是聚集索引,所以我們在葉子節(jié)點上直接就找到了我們想找的數(shù)據(jù)。

非聚集索引

下面是一個模擬部首索引的組織形式。我們由根節(jié)點逐級往下查詢,但是在最后的葉子節(jié)點上并沒有找到我們想找的數(shù)據(jù),那么在使用這個索引時我們是如何得到最終的結果的呢?回憶之前字典中“檢字表”的內(nèi)容,我們可以看到,在每個字邊上都有一個頁碼,這就相當于下面這一個索引中葉子節(jié)點上字與字中間的指針,這個指針會告訴我們真正的數(shù)據(jù)在什么地方。

下圖中,我們把非聚集索引(部首索引)和聚集索引(拼音索引)合在一起就能看出非聚集索引最后到底如何查找到實際數(shù)據(jù)了。非聚集索引葉子節(jié)點上的指針會直接指向聚集索引的葉子節(jié)點,因為根據(jù)聚集索引的定義,所有數(shù)據(jù)都是按聚集索引組織存儲的,所以所有實際數(shù)據(jù)都保存在聚集索引的葉子節(jié)點中。而從非聚集索引的葉子節(jié)點鏈接到聚集索引的葉子節(jié)點查詢實際數(shù)據(jù)的過程就叫做——回表。

全覆蓋索引

那么如果我們只是想要驗證字的偏旁是否是雙耳旁“阝”呢?這種情況下,我們只要在部首索引中下游的葉子節(jié)點中找到了字就足夠了。這種在索引中就獲取到了SQL語句中需要的所有字段,所以不需要再回表查詢的情況中,這個索引就被稱為這個SQL語句的全覆蓋索引。

在實際的數(shù)據(jù)庫中,非聚集索引的葉子節(jié)點上保存的“指針”就是聚集索引中所有字段的值,要獲取一條實際數(shù)據(jù),就需要通過這幾個聚集索引字段的值重新在聚集索引上執(zhí)行一遍查詢操作。如果數(shù)據(jù)量不多,這個開銷是非常小的;但如果非聚集索引的查詢結果中包含了大量數(shù)據(jù),那么就會導致回表的開銷非常大,甚至超過不走索引的成本。所以全覆蓋索引可以節(jié)約回表的開銷這一點在一些回表開銷很大的情況下就非常重要了。

范圍查詢條件

上圖是一個聯(lián)合索引idx_eg(col_a, col_b)的結構,如果我們希望查詢一條滿足條件col_a = 64 and col_b = 128的記錄,那么我們可以一路確定地往下找到唯一的下級節(jié)點最終找到實際數(shù)據(jù)。這種情況下,索引上的col_acol_b兩個字段都能被使用。

但是如果我們將查詢條件改為范圍查詢col_a > 63 and col_b = 128,那么我們就會需要查找所有符合條件col_a > 63的下級節(jié)點指針,最后不得不遍歷非常多的節(jié)點及其子節(jié)點。這樣的話對于索引來說就得不償失了,所以在這種情況下,數(shù)據(jù)庫會選擇直接遍歷所有滿足條件col_a > 63的記錄,而不再使用索引上剩下的col_b字段。數(shù)據(jù)庫會從第一條滿足col_a > 63的記錄開始,橫向遍歷之后的所有記錄,從里面排除掉所有不滿足col_b = 128的記錄。

這就是范圍條件會終止使用聯(lián)合索引上的后續(xù)字段的原因。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17912.html

相關文章

  • 20分鐘數(shù)據(jù)庫索引設計實戰(zhàn)

    摘要:在后端開發(fā)的工作中如何輕松高效地設計大量數(shù)據(jù)庫索引呢通過下面這四步,分鐘后你就再也不會為數(shù)據(jù)庫的索引設計而發(fā)愁了。順暢地閱讀這篇文章需要了解數(shù)據(jù)庫索引的組織方式,如果你還不熟悉的話,可以通過另一篇文章來快速了解一下數(shù)據(jù)庫索引融會貫通。 在后端開發(fā)的工作中如何輕松、高效地設計大量數(shù)據(jù)庫索引呢?通過下面這四步,20分鐘后你就再也不會為數(shù)據(jù)庫的索引設計而發(fā)愁了。 順暢地閱讀這篇文章需要了解數(shù)...

    zhonghanwen 評論0 收藏0

發(fā)表評論

0條評論

chanthuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<