1. 程式人生 > >面試測試開發被問到資料庫索引不知道怎麼辦?這篇文章告訴你

面試測試開發被問到資料庫索引不知道怎麼辦?這篇文章告訴你

# 提出的問題 什麼情況下建立索引,什麼時候不需要索引? 索引的種類有哪些? # 什麼是索引 索引就是幫助資料庫管理系統高效獲取資料的資料結構,就好比一本書的目錄,它可以幫我們快速進行特定值的定位與查詢,從而加快資料查詢的效率。 # 索引的種類 ## 從功能邏輯上劃分 * 普通索引是基礎的索引,沒有任何約束,主要用於提高查詢效率 * 唯一索引就是在普通索引的基礎上增加了資料唯一性的約束,在一張資料表裡可以有多個唯一索引 * 主鍵索引在唯一索引的基礎上增加了不為空的約束,也就是 NOT NULL+UNIQUE,一張表裡最多隻有一個主鍵索引 * 全文索引用的不多,MySQL 自帶的全文索引只支援英文。我們通常可以採用專門的全文搜尋引擎,比如 ES(ElasticSearch) 和 Solr ## 從物理實現方式分 * 聚集索引 * 聚集索引可以按照主鍵來排序儲存資料,這樣在查詢行的時候非常有效 * 非聚集索引 * 在資料庫系統會有單獨的儲存空間存放非聚集索引,這些索引項是按照順序儲存的,但索引項指向的內容是隨機儲存的。也就是說系統會進行兩次查詢,第一次先找到索引,第二次找到索引對應的位置取出資料行,是維護單獨的索引表(只維護索引,不維護索引指向的資料。 * 區別 * 聚集索引的葉子節點儲存的就是我們的資料記錄,非聚集索引的葉子節點儲存的是資料位置。非聚集索引不會影響資料表的物理儲存順序。 * 一個表只能有一個聚集索引,因為只能有一種排序儲存的方式,但可以有多個非聚集索引,也就是多個索引目錄提供資料檢索。 * 使用聚集索引的時候,資料的查詢效率高,但如果對資料進行插入,刪除,更新等操作,效率會比非聚集索引低 # 索引的原理 ## 索引為什麼要儲存在硬碟上 資料庫伺服器有兩種儲存介質,硬碟和記憶體,儲存在記憶體時如果發生故障比如斷點什麼的,容易造成資料丟失,儲存在磁碟上,會有很多的IO,我們知道磁碟IO是會耗時的,如果讓索引的資料結構儘可能的減少磁碟IO操作,那麼耗時就會大大減少。 ## 從二叉樹到B+樹 支援快速查詢的資料結構有跳錶、hash表、二叉樹搜尋樹,跳錶支援區間查詢,hash表不支援區間查詢,二叉樹搜尋樹不支援按照區間快速查詢,但是二叉樹搜尋樹的不斷演進和改造滿足了索引對資料結構的要求,下面來看看二叉搜尋到B+樹的演進歷程。 二叉搜尋樹是一種比較特別大的二叉樹,每個節點的左子節點都小於父節點,右子節點大於父節點,查詢一個接地那的時間複雜度是O(log2n)。 iShot 2020-03-05 22.55.45.png![file](https://img2020.cnblogs.com/other/1960827/202003/1960827-20200310110339537-1800799965.png) 但是隨著不斷往樹上新增節點,可能會造成一種現象,某一條路徑會不斷增加,最後二叉樹退化成了一個連結串列,時間複雜度變成了O(n)。 如果能讓左右子樹之間的高度差不大,還能繼續維持二叉搜尋樹的特性,大牛們提出了平衡二叉樹這種結構,他讓每個節點的左右子樹高度差不能超過1,這屬於嚴格平衡的,比如avl樹,但是這種嚴格平衡的樹,維護高度差需要設計複雜的演算法去實現,時間成本也會增加,後來又有大牛提出,我們不讓他嚴格平衡,高度差不要太大就行,雖然會損失一點查詢速度,但是樹的複雜性大大降低,查詢效率也能滿足要求就行,這種樹就叫做紅黑樹。 資料查詢的時間主要依賴於磁碟 I/O 的次數,如果我們採用二叉樹的形式,即使通過平衡二叉搜尋樹進行了改進,樹的深度也是 O(log2n),當 n 比較大時,深度也是比較高的。 這個時候大牛又來了,那就該成多叉樹吧,多叉樹可以降低高度,這樣就可以減少磁碟IO次數了,給這種樹起個名字,就叫多叉平衡樹,Balance Tree。那究竟該是多少個叉呢,這個是根據記憶體頁大小計算出來的。 Balance Tree也就是B樹,B樹的節點是可以儲存資料的,這樣就會造成查詢效率不穩定的情況,有時候訪問到了非葉子節點就可以找到關鍵字,而有時需要訪問到葉子節點才能找到關鍵字。 這個時候就又提出了B+樹,B+樹非葉子節點只儲存索引不存資料,葉子節點才儲存資料記錄,葉子節點又構成一個雙向連結串列並且從大到小順序連結。 > 歡迎大家去 [我的部落格](https://www.immortalp.com) 瞅瞅,裡面有更多關於測試實戰的內容