【BATJ】面試必問MySQL索引實現原理

BATJ面試題剖析

一、爲何須要使用索引?html

二、數據結構Hash、平衡二叉樹、B樹、B+區別?mysql

三、機械硬盤、固態硬盤區別?面試

四、Myisam與Innodb B+樹的區別?算法

五、MySQL中的索引什麼數據結構?sql

六、MySQL數據庫優化方案?數據庫

1.爲何須要使用索引?

MySQL官方對索引的定義爲:索引(Index)是幫助 MySQL 高效獲取數據的數據結構。數組

也就是說:索引就像書的目錄同樣能夠很是快速的定位到書的頁碼。數據結構

若是向mysql發出一條sql語句請求,查詢的字段沒有建立索引的話,可能會致使全表掃描,這樣查詢效率很是低函數

2.1數據結構Hash算法

哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作散列函數,存放記錄的數組叫作散列表工具

優勢:經過字段的值計算的hash值,定位數據很是快,查找能夠直接根據key訪問。

缺點: 由於底層數據結構是散列的,沒法進行比較大小,不能進行範圍查找

index=Hash(key)

2.2數據結構平衡二叉樹算法

平衡二叉查找樹,又稱 AVL樹。 它除了具有二叉查找樹的基本特徵以外,還具備一個很是重要的特色:它 的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值(平衡因子 ) 不超過1。 也就是說AVL樹每一個節點的平衡因子只多是-一、0和1(左子樹高度減去右子樹高度)。

數據結構模擬工具

官網首頁:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Avl數據結構https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

平衡二叉樹 查詢原理

假設查詢10 (須要經歷4次IO操做)

1次 從硬盤中讀取4 (內存),判斷下10>4,取右指針
2次 從硬盤中讀取8 (內存),判斷下10>8,取右指針
3次 從硬盤中讀取9 (內存),判斷下10>,取右指針
4次 從硬盤中讀取10 (內存),判斷下10=10,定位到數據

優勢:平衡二叉樹算法基本與二叉樹查詢相同,效率比較高

缺點:插入操做須要旋轉,支持範圍查詢,雖然支持範圍查詢,可是迴旋查詢效率低

規律:若是樹的高度越高,那麼查詢IO次數會越多。

2.3數據結構B

維基百科對B樹的定義爲「在計算機科學中,B樹(B-tree)是一種樹狀數據結構,它可以存儲數據、對其進行排序並容許以O(log n)的時間複雜度運行進行查找、順序讀取、插入和刪除的數據結構。B樹,歸納來講是一個節點能夠擁有多於2個子節點的二叉查找樹。與自平衡二叉查找樹不一樣,B-樹爲系統最優化大塊數據的讀和寫操做B-tree算法減小定位記錄時所經歷的中間過程,從而加快存取速度。廣泛運用在數據庫文件系統

由於B樹節點元素比平衡二叉樹要多,因此B樹數據結構相比平衡二叉樹數據結構實現減小磁盤IO的操做

如何去減小查詢IO次數?

B樹在平衡二叉樹中,減小樹的高度

結論:B樹比平衡二叉樹減小了一次IO操做

B樹查詢效率比平衡二叉樹效率要高,由於B樹的節點中能夠有多個元素,從而減小樹的高度,減小IO操做,從而提升查詢效率,缺點:範圍查詢效率仍是比較低。

2.4數據結構B+

B+樹相比B樹,新增葉子節點與非葉子節點關係,葉子節點中包含了keyvalue,非葉子節點中只是包含了key,不包含value。

全部相鄰的葉子節點包含非葉子節點,使用鏈表進行結合,有必定順序排序,從而範圍查詢效率很是高

B+樹 解決範圍查詢問題、減小IO查詢的操做。

B+樹算法: 經過繼承了B樹的特徵,經過非葉子節點查詢葉子節點獲取對應的value,全部相鄰的葉子節點包含非葉子節點,使用鏈表進行結合,有必定順序排序,從而範圍查詢效率很是高

缺點:由於有冗餘節點數據,會比較佔內存

三、機械硬盤、固態硬盤區別?

固態硬盤對比機械硬盤優點圖表

四、Myisam與Innodb B+樹的區別?

索引文件如何查看

默認數據與索引文件位置: /var/lib/mysql

MyISAM引擎的文件:

.myd my data,表數據文件

.myi my index,索引文件

.log 日誌文件

InnoDB引擎的文件

採用表空間(tablespace)來管理數據,存儲表數據和索引,

InnoDB數據庫文件(即InnoDB文件集,ib-file set):

ibdata1ibdata2等:系統表空間文件,存儲InnoDB系統信息和用戶數據庫表數據和索引,全部表共用。

.ibd文件:單表表空間文件,每一個表使用一個表空間文件(file per table),存放用戶數據庫表數據和索引。

MyISAMInnoDBB-Tree索引不一樣的實現方式

主鍵索引: MyISAM引擎使用B+Tree做爲索引結構葉節點的data域存放的是數據記錄的地址。下圖是MyISAM主鍵索引的,這裏設表一共有三列,假設咱們以Col1爲主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。能夠看出

InnoDB也使用B+Tree做爲索引結構,但具體實現方式卻與MyISAM大相徑庭.

 MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件自己就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。

五、MySQL中的索引什麼數據結構?

使用B+Tree做爲索引結構,使用InnoDB引擎,葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。

六、MySQL數據庫優化方案?

Mysql的優化,大致能夠分爲三部分:索引的優化,sql慢查詢優化,表的優化

開啓慢查詢日誌,可讓MySQL記錄下查詢超過指定時間的語句,經過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。

                              先捕獲低效SQL→慢查詢優化方案→慢查詢優化原則

訊雲MySQL數據庫監控

版權@須臾之餘https://my.oschina.net/u/3995125

1.騰訊雲數據庫地址:https://console.cloud.tencent.com/cdb

2. 實例監控https://console.cloud.tencent.com/cdb?ins=4-cdb-0g6a8qct
相關文章
相關標籤/搜索