面試官 為啥加了索引查詢會變快?

2021-10-07 19:29:42 字數 2627 閱讀 8780

面試官:你在工作中有遇到sql查詢比較慢的情況嗎?

果子:有的。隨著業務的發展,表中的資料量會越來越大,查詢就會越來越慢

面試官:那你是如何優化查詢慢的問題?

果子:在需要查詢的列上加索引

面試官:那你知道為什麼加索引可以讓查詢變快嗎?

果子:。。。思考中。。。

今天我們就來聊一聊,為什麼加了索引查詢會變快?

在關聯式資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單

假如你現在看一本書,首先肯定會先看書的目錄,看看這本書到底有哪些內容,然後通過目錄找到自己感興趣的章節進行閱讀

這裡的書就相當於資料庫中的表,目錄就相當於索引,查詢表中的資料通過索引可以快速找到對應的資料

索引的資料結構是b+樹,這裡的b指的是balance(平衡),那為啥要用平衡的樹呢?我們先來複習一下資料結構和演算法

二分查詢

二分查詢也叫對半查詢法,就是每次查詢先找中位數,通過中位數就可以過濾掉一半的結果,比如有如下有序陣列

3,5

,9,12

,17,18

,27

現在我們要查詢18這個元素,假設我們用順序查詢法需要查詢6次才可以完成

用二分查詢,先找中位數12,目標18比12要大,往右繼續找中位數,第二次中位數就是18,可以看到二分查詢只需要2次就可以找到

可以看到二分查詢減少了查詢次數,大大的提公升了查詢的效率

有的人可能會說,我查詢元素3,順序查詢只需要一次就可以找到,但二分查詢需要3次才可以找到

二分查詢是一種演算法,演算法體現的整體上的時間,順序查詢在特殊場景下可能是比二分查詢要快一些,但整體上是慢於二分查詢的

順序查詢的時間複雜度為o(n),二分查詢的時間複雜度為o(log n)

平衡二叉樹

平衡二叉樹是基於二分查詢提高資料查詢速度的二叉樹的資料結構,如下圖

平衡二叉樹的特點:

保證樹的平衡是為了保證查詢的速度更快,樹的高度越小,查詢速度越快,假如樹不平衡,如下圖

這樣樹的查詢效率就退化成順序查詢,完全失去了樹的優勢

b樹b樹減少了定位記錄時所經歷的中間過程,從而加快訪問速度。普遍運用在資料庫和檔案系統

b樹的特點:

傳統的平衡二叉樹有很多,而且效能也很高,那為什麼還需要b樹這類資料結構?

當資料量小的時候,傳統的平衡二叉樹確實效能很高,而隨著資料量越來越大,傳統平衡樹的高度相對較大,這樣邏輯上很近的節點實際可能非常遠,無法很好的利用磁碟預讀(區域性性原理)

空間區域性性原理:如果乙個儲存器的某個位置被訪問,那麼將它附近的位置也會被訪問
索引的效率依賴與磁碟 io 的次數,快速索引需要有效的減少磁碟 io 次數,如何快速索引呢?索引的原理其實是不斷的縮小查詢範圍,就如我們平時用字典查單詞一樣,先找首字母縮小範圍,再第二個字母等等。平衡二叉樹是每次將範圍分割為兩個區間。為了更快,b-樹每次將範圍分割為多個區間,區間越多,定位資料越快越精確

b+樹b+樹是b樹的乙個公升級版,相對於b樹來說b+樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度完全接近於二分法查詢,

而mysql中innodb儲存引擎的索引就是使用的b+樹作為資料結構

b+樹的特點:

b+樹天然具備排序功能:b+樹所有的葉子節點資料構成了乙個有序鍊錶,在查詢大小區間的資料時候更方便,資料緊密性很高,快取的命中率也會比b樹高

b+樹全節點遍歷更快:b+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,,而不需要像b樹一樣需要對每一層進行遍歷,這有利於資料庫做全表掃瞄

b樹相對於b+樹的優點是,如果經常訪問的資料離根節點很近,而b樹的非葉子節點本身存有關鍵字其資料的位址,所以這種資料檢索的時候會要比b+樹快

b+樹區別於b樹的最明顯特徵是:

為啥不用雜湊演算法

我們知道雜湊的演算法複雜度是o(1),明顯要快於b+樹,那索引為啥不使用雜湊演算法,而要使用b+樹

在使用等於、in等精確匹配的情況下,雜湊確實是要快於b+樹

但關係型資料庫的操作遠遠不止這些簡單的操作,當需要使用排序、範圍查詢等操作時,雜湊的效率會遠遠低於b+樹

所以說b+樹是一種綜合了各方面考慮的資料結構

為啥加了索引,查詢會變快?

是因為索引使用了b+樹資料結構來儲存,利用二分查詢的原理,有效的減少了磁碟io的次數,所以查詢會變快~~~~

參考:

關於SVM,面試官會怎麼問?

公式較多,希望大家耐心慢慢理清楚 持續準備面試中。準備的過程中,慢慢發現,如果死記硬背的話很難,可當推導一遍並且細細研究裡面的緣由的話,面試起來應該什麼都不怕,問什麼問題都可以由公式推導得到結論,不管問什麼,公式擺在那裡,影響這個公式的變數就在那,你問什麼我答什麼。共勉!svm 是一種二類分類模型。...

摘錄 面試官也許會這樣問你

回答樣本一 我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。回答樣本二 我受過系統的軟體程式設計的訓練,不需要進行大量的培訓,而且我本人也對程式設計特別感興趣。因此,我希望公司能根據我的情況和市場標準的水平,給我合理的薪水。回...

面試時,你會問面試官哪些問題?

明天又要去參加一次面試。每次面試的時候,面試官都會在最後給面試者一些時間,來問問題。這是個非常好的機會,能按照自己的思路,來了解職位 技 術 企業文化 福利待遇 企業狀況和前景等情況,以彌補前面面試過程中沒有了解到的情況。但較早以前面試準備不太充分,雖然也能地問上一些問題,但掛一漏 萬,每次回來後,...