不知道你有沒有這種感受,那些所謂的數據結構和算法,在平常開發工做中不多用到或者幾乎未曾用到,可能只是在每次換工做準備面試的時候纔會撿起來學習學習。mysql
那我但願今天這篇文章能讓你對數據結構的具體應用能有個初步的概念,就從咱們天天都在用的 mysql 數據庫提及吧。面試
今天這個標題,嚴格來講實際上是不正確的,我在前面的文章中有這麼解釋過:算法
首先,mysql 主要是由 server 層和存儲層兩部分構成的。server >層主要包括鏈接器、查詢緩存,分析器、優化器、執行器。存儲層主要是用來存儲和查詢 數據的,經常使用的存儲引擎有 InnoDB、MyISAM,MySQL 5.5.5版本後使用 InnoDB >做爲默認存儲引擎。sql
這篇文章咱們主要討論 mysql 的存儲層,不一樣的存儲引擎其底層的數據結構是不同的,咱們這裏就以默認的 InnoDB 爲例,因此嚴格來講應該是 InnoDB 爲啥要選擇 B+ 樹這種數據結構來存儲數據。數據庫
在文章正式開始以前,你先要知道 mysql 中的 InnoDB 在底層是採用 B+ 樹這種數據結構來存儲數據的。你先記住就行了,下面咱們再來一步一步解釋爲何。數組
首先你要知道,mysql 的索引主要是爲了提升查詢效率的,那必定得找一個合適的數據結構來存儲數據,哈希表、數組、二叉搜索樹這三種常見的數據結構均可以提升查詢效率。緩存
哈希表就是一種以鍵值對來存儲數據的結構,你能夠經過一個 key 就能夠很快的查詢出對用的 value 值。哈希表主要是利用了數組的隨機訪問特性,實現思想主要是經過一個哈希函數把 key 轉換成一個哈希值,這個哈希值就對應數組中的某個下標。數據結構
可是因爲哈希表是無序的,區間查詢效率會很是的慢,因此哈希表一般只用於查詢單個值。數據結構和算法
數組就好說了,數組具備連續性和隨機訪問特性,所以數組都能很高效的進行單個等值查詢和區間查詢,可是 mysql 不只僅是查詢數據,還會有插入和刪除數據的操做。函數
在有序數組中插入或刪除一個數據會須要批量移動數組中其餘數據,這是一個不小的消耗,影響性能。所以有序數組適合處理靜態數據,好比一些過往的不會再修改的數據。
在這裏你可能會問,既然哈希表其實也是利用了數組的特性,那有了數組爲啥還須要哈希表呢。是由於數組下標 key 只能是數字,而哈希表能夠支持字符串 key,哈希函數能夠把這個 key 轉換成一個數組下標。
同時,不一樣的 key 若是經過哈希函數轉換成了相同的數組下標,這就會形成衝突,在哈希表中通常會經過再拉出一個鏈表來保存這個衝突的值。
關於哈希表這裏就再也不多說了,後面的文章再詳細解釋哈希表的原理以及相關應用。
注意,二叉搜索樹和二叉樹不同,二叉樹是指每一個節點的左兒子小於父節點,父節點又小於右兒子,即二叉搜索樹的中序遍歷就是一個有序序列。
因爲索引不只僅是存在內存中,還會存儲在硬盤中,所以就會涉及到 IO 性能了,就要求樹的高度不能過高。實際上 B+ 樹就是經過二叉搜索樹推演改進的,我將在後面的文章再詳細解釋這個改進過程。
哈希表適合等值查詢,因爲是無序的,區間查詢會很慢。
有序數組適合等值和區間查詢,可是數組具備連續性,插入和刪除操做均可能須要移動其餘元素。
二叉搜索樹因爲樹的高度,區間查詢須要中序遍歷,都會致使查詢效率很慢。
注意,在一些文章中常常會把 B+ 樹說成 B 樹或者 B-tree,這實際上是錯誤的,B 樹和 B+ 是兩種不一樣的樹,B+ 樹是 B 樹的一個優化,後面的文章我會再詳細解釋這個優化過程。
並且 B- 樹其實也就是 B 樹,這個符號並非加減中的減號,並非所謂的 "B 減樹",只是一個鏈接符號而已。
這篇文章就先寫到這了,但願你能有些收穫,若是對你有一點點幫助,就給文章點個好看吧,感謝支持。