筆者看過不少數據庫相關方面的面試題,但大多數答案都不太準確,所以決定在本身blog進行一個總結。mysql
Q1:數據庫有哪些索引?優缺點是什麼?面試
1.B樹索引:大多數數據庫採用的索引(innoDB採用的是b+樹)。可以加快訪問數據的速度,尤爲是範圍數據的查找很是快。缺點是隻能從索引的最左列開始查找,也不能跳過索引中的列,若是查詢中有某個列用到了範圍查詢,則右邊全部列都沒法使用索引優化查找。算法
2.哈希索引:基於哈希表實現。在MySQL中,只有Memory引擎顯式的支持哈希搜索。哈希查找的速度很是快,但哈希索引只包含哈希值和行指針,不存儲字段值,因此不能用索引中的值來避免讀取行,也不能進行排序。因爲哈希索引使用的是索引列的所有內容來計算哈希值的,因此不支持部分全部列匹配查找。哈希只支持等值比較,不支持任何範圍查詢。一旦哈希衝突不少的話,維護成本很是高。innoDB支持「自適應哈希索引」(adaptive hash index)。sql
3.全文索引:全文索引是一種特殊類型的索引,它查找的是文本中的關鍵字,而不是比較索引的值。最初只能在MyISAM上使用,5.6.24之後innoDB也支持了全文索引。全文索引的查詢要使用Match....against,在相同的列上同時建立全文搜索和基於值的B-Tree索引不會有衝突。數據庫
4.空間數據索引(R-tree索引),MyISAM支持R樹索引,好處是無需前綴查詢,會從全部緯度來索引數據,能夠用做地理數據的存儲;缺點是必須使用MySQL的GIS相關函數如MBRCONTAINS( )等來維護數據,但因爲MySQL中的GIS並不完善,所以大多數人不會使用這個特性。數據結構
Q2:爲何不實用二叉查找樹或者紅黑樹做爲數據庫索引。函數
二叉樹在處理海量數據時,樹的高度過高,雖然索引效率很高,達到logN,但會進行大量磁盤io,得不償失。並且刪除或者插入數據可能致使數據結構改變變成鏈表,須要增進平衡算法。而紅黑樹,插入刪除元素的時候會進行頻繁的變色和旋轉(左旋,右旋),很浪費時間。可是當數據量很小的時候,徹底能夠放入紅黑樹中,此時紅黑樹的時間複雜性比b樹低。所以,綜上考慮,數據庫最後選擇了b樹做爲索引。性能
Q3:B tree和B+ tree應用場景:優化
1.B樹經常使用於文件系統,和少部分數據庫索引,好比mongoDB。指針
2.B+樹主要用於mysql數據庫索引。
Q4:B+ tree對比B tree的優勢
B樹的每一個節點除了存儲指向 子節點的索引外,還要存儲data域,所以單一節點指向子節點的索引並非不少,樹的高度較高,磁盤io次數較多。B+樹的高度更低,且全部data都存儲在葉子節點,葉子節點都處於同一層,所以查詢性能穩定,便於範圍查找。