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

提出的問題

什麼狀況下建立索引,何時不須要索引?算法

索引的種類有哪些?數據庫

什麼是索引

索引就是幫助數據庫管理系統高效獲取數據的數據結構,就比如一本書的目錄,它能夠幫咱們快速進行特定值的定位與查找,從而加快數據查詢的效率。服務器

索引的種類

從功能邏輯上劃分

  • 普通索引是基礎的索引,沒有任何約束,主要用於提升查詢效率
  • 惟一索引就是在普通索引的基礎上增長了數據惟一性的約束,在一張數據表裏能夠有多個惟一索引
  • 主鍵索引在惟一索引的基礎上增長了不爲空的約束,也就是 NOT NULL+UNIQUE,一張表裏最多隻有一個主鍵索引
  • 全文索引用的很少,MySQL 自帶的全文索引只支持英文。咱們一般能夠採用專門的全文搜索引擎,好比 ES(ElasticSearch) 和 Solr

從物理實現方式分

  • 彙集索引
    • 彙集索引能夠按照主鍵來排序存儲數據,這樣在查找行的時候很是有效
  • 非彙集索引
    • 在數據庫系統會有單獨的存儲空間存放非彙集索引,這些索引項是按照順序存儲的,但索引項指向的內容是隨機存儲的。也就是說系統會進行兩次查找,第一次先找到索引,第二次找到索引對應的位置取出數據行,是維護單獨的索引表(只維護索引,不維護索引指向的數據。
  • 區別
    • 彙集索引的葉子節點存儲的就是咱們的數據記錄,非彙集索引的葉子節點存儲的是數據位置。非彙集索引不會影響數據表的物理存儲順序。
    • 一個表只能有一個彙集索引,由於只能有一種排序存儲的方式,但能夠有多個非彙集索引,也就是多個索引目錄提供數據檢索。
    • 使用匯集索引的時候,數據的查詢效率高,但若是對數據進行插入,刪除,更新等操做,效率會比非彙集索引低

索引的原理

索引爲何要存儲在硬盤上

數據庫服務器有兩種存儲介質,硬盤和內存,存儲在內存時若是發生故障好比斷點什麼的,容易形成數據丟失,存儲在磁盤上,會有不少的IO,咱們知道磁盤IO是會耗時的,若是讓索引的數據結構儘量的減小磁盤IO操做,那麼耗時就會大大減小。數據結構

從二叉樹到B+樹

支持快速查找的數據結構有跳錶、hash表、二叉樹搜索樹,跳錶支持區間查找,hash表不支持區間查詢,二叉樹搜索樹不支持按照區間快速查詢,可是二叉樹搜索樹的不斷演進和改造知足了索引對數據結構的要求,下面來看看二叉搜索到B+樹的演進歷程。測試

二叉搜索樹是一種比較特別大的二叉樹,每一個節點的左子節點都小於父節點,右子節點大於父節點,查找一個接地那的時間複雜度是O(log2n)。搜索引擎

iShot 2020-03-05 22.55.45.pngfile設計

可是隨着不斷往樹上添加節點,可能會形成一種現象,某一條路徑會不斷增長,最後二叉樹退化成了一個鏈表,時間複雜度變成了O(n)。blog

若是能讓左右子樹之間的高度差不大,還能繼續維持二叉搜索樹的特性,大牛們提出了平衡二叉樹這種結構,他讓每一個節點的左右子樹高度差不能超過1,這屬於嚴格平衡的,好比avl樹,可是這種嚴格平衡的樹,維護高度差須要設計複雜的算法去實現,時間成本也會增長,後來又有大牛提出,咱們不讓他嚴格平衡,高度差不要太大就行,雖然會損失一點查詢速度,可是樹的複雜性大大下降,查詢效率也能知足要求就行,這種樹就叫作紅黑樹。排序

數據查詢的時間主要依賴於磁盤 I/O 的次數,若是咱們採用二叉樹的形式,即便經過平衡二叉搜索樹進行了改進,樹的深度也是 O(log2n),當 n 比較大時,深度也是比較高的。索引

這個時候大牛又來了,那就該成多叉樹吧,多叉樹能夠下降高度,這樣就能夠減小磁盤IO次數了,給這種樹起個名字,就叫多叉平衡樹,Balance Tree。那究竟該是多少個叉呢,這個是根據內存頁大小計算出來的。

Balance Tree也就是B樹,B樹的節點是能夠存儲數據的,這樣就會形成查詢效率不穩定的狀況,有時候訪問到了非葉子節點就能夠找到關鍵字,而有時須要訪問到葉子節點才能找到關鍵字。

這個時候就又提出了B+樹,B+樹非葉子節點只存儲索引不存數據,葉子節點才存儲數據記錄,葉子節點又構成一個雙向鏈表而且從大到小順序連接。

歡迎你們去 個人博客 瞅瞅,裏面有更多關於測試實戰的內容哦!!

相關文章
相關標籤/搜索