現在的位置: 首頁 > 搜索技術 > 正文

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

2020年02月19日 搜索技術 ⁄ 共 1428字 ⁄ 字型大小 評論關閉

  索引是什麼

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

  資料庫中的索引

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

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

  既然索引是為了提高查詢效率,現如今最快的查找演算法莫過於時間複雜度為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 是使用不到的。

抱歉!評論已關閉.