索引看這篇就夠了

點擊上方“碼農尼克關注公衆號,一起來學習

索引是什麼

索引是一種可以加快查詢的數據結構。例如我們在讀書,查新華字典的時候,我們不會一頁一頁的翻去找到我們要查找的內容。我們是在書的前幾頁的目錄中首先找到我們要查找的內容在書中的第幾頁,然後直接翻到那一頁就找到了我們的目標內容。

數據庫中的索引

那麼類似上面的例子,在數據庫中面對千千萬萬的磁盤數據,當我們查找的時候也不可能一個一個磁盤塊去查找數據,這樣的效率是很低的。同樣,偉大的前輩們創造了數據庫的索引,這樣我們在查找數據的時候,先在索引中找到我們的目標在磁盤上的位置,然後去查找,這樣極大的節約了查找時間。

索引是怎樣的一種數據結構

既然索引是爲了提高查詢效率,現如今最快的查找算法莫過於時間複雜度爲O(logN)二分查找算法了。二分查找隨快,但是要求元素必須是有序的。數據庫中的元素是不斷的累加的上去的,如果要求有序,則每次插入數據就需要給元素排序。如果索引存儲在數組的數據結構上,那麼數據的插入和刪除將是一個災難。那麼有沒有一種數據結構是擅長插入和刪除操作的呢?沒錯,就是鏈表,但是鏈表上面是做不了二分查找的(此處不用解釋吧?不懂的小夥伴自行Google)。那麼增養才能做到,使用二分查找,又善於增/刪操作呢,如此重任非二叉平衡搜索樹莫屬了。

二叉平衡搜索樹

假如我們使用二叉平衡搜索樹作爲索引的數據結構,搜索一個目標數據的時間複雜度相較於O(n)的算法,已經提升到了O(logN)了。但這還不夠,因爲索引是存儲在磁盤上的,I/O操作是非常耗時間的,一次I/O操作的時間CPU可以執行幾十萬次指令了,是否還可以繼續減少I/O的次數呢?B樹。

B 樹

B 樹二叉平衡樹的變體,它是多路搜索樹,通俗來講就是叉路變多了,由於叉樹變多了,則樹的層數就會減少,層數減少則意味着I/O次數的減少。B樹將數據存儲在節點中,搜索時將節點中的數據取出然後在內存中使用二分查找,找到對應的數據是很快的。哪還有沒有可能繼續減少I/O次數呢(樹的層次減少一層,即可減少一次I/O的次數),減少I/O,讓CPU計算來加快整體的速度。B+樹。

B+樹

操作系統I/O操作的單位爲頁,根據操作系統的不同,頁存儲的數據大小不同。如果每個頁裏面存入更多的數據,意味着I/O的次數減少。B+樹將所有數據元素存儲在葉子節點上,則非葉子節點上就可以存儲更多的指針數據,這樣就可以分出更多的叉路,同時意味着樹結構的層數更少,則I/O的次數變得更少,整體搜索速度得到了更大的提升。因此,mysql 的 innodb 採用了 B+ 樹來作爲索引。

覆蓋索引

Mysql 的索引採用B+樹作爲數據結構,數據庫中數據全部都存儲在了葉子節點上,索引字段的值會存儲在樹的節點上,因此就會有覆蓋索引的說法。假如我們要查找的字段就包含在索引中,則查詢的效率會更高,因爲它避免了去葉子節點查找的步驟。

索引的最左匹配原則

最左匹配原則說的是搜索的時候,該 SQL 語句是否可以利用到索引來提升效率。假設我們在數據庫中建立了聯合索引(name,age,addres),那麼我們在寫 SQL 語句的時候,where 條件中 name,age,address 同時他們所在的表達式不是 全模糊/左模糊查詢,則該查詢可以使用索引,同時不論他們在 SQL 條件中的順序,因爲數據庫會將他們優化成合適的順序。但是假如你的條件中只有name 和 addres,那麼只有 name 可以使用索引,address 是使用不到的。

—————END—————

喜歡本文的朋友們,歡迎長按下圖關注訂閱號碼農尼克,收看更多精彩內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章