1. 程式人生 > >【BATJ】面試必問MySQL索引實現原理

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

BATJ面試題剖析

1、為什麼需要使用索引?

2、資料結構Hash、平衡二叉樹、B樹、B+區別?

3、機械硬碟、固態硬碟區別?

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

5、MySQL中的索引什麼資料結構?

6、MySQL資料庫優化方案?

1.為什麼需要使用索引?

MySQL官方對索引的定義為:索引(Index)是幫助 MySQL 高效獲取資料的資料結構。

也就是說:索引就像書的目錄一樣可以非常快速的定位到書的頁碼。

如果向mysql發出一條sql語句請求,查詢的欄位沒有建立索引的話,可能會導致全表掃描,這樣查詢效率非常低

2.1資料結構
Hash演算法

雜湊表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表

優點:通過欄位的值計算的hash值,定位資料非常快,查詢可以直接根據key訪問。

缺點: 因為底層資料結構是雜湊的,無法進行比較大小,不能進行範圍查詢

index=Hash(key)

2.2資料結構平衡二叉樹演算法

平衡二叉查詢樹,又稱 AVL樹。 它除了具備二叉查詢樹的基本特徵之外,還具有一個非常重要的特點:它 的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值(

平衡因子 ) 不超過1。 也就是說AVL樹每個節點的平衡因子只可能是-1、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,所有相鄰的葉子節點包含非葉子節點,使用連結串列進行結合,有一定順序排序,從而範圍查詢效率非常高

缺點:因為有冗餘節點資料,會比較佔記憶體

3、機械硬碟、固態硬碟區別?

固態硬碟對比機械硬碟優勢圖表

4、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表資料檔案本身就是主索引。

5、MySQL中的索引什麼資料結構?

使用B+Tree作為索引結構,使用MyISAM引擎索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的地址

6、MySQL資料庫優化方案?

Mysql的優化,大體可以分為三部分:索引的優化,sql慢查詢優化,表的優化

開啟慢查詢日誌,可以讓MySQL記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。

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

訊雲MySQL資料庫監控

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

2. 例項監控https://console.cloud.tencent.com/cdb?ins=4-cdb-0g6a8qct