久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當前位置:首頁>職場>mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)

發布時間:2024-01-24閱讀(11)

導讀首先我們先看幾個問題:(答案在文章尾)1、存儲引擎是基于數據庫還是表的?2、聚集(簇)索引和非聚集(簇)索引的區別是什么?3、為什么建議InnoDB表必須建....

首先我們先看幾個問題:(答案在文章尾)

1、存儲引擎是基于數據庫還是表的?

2、聚集(簇)索引和非聚集(簇)索引的區別是什么?

3、為什么建議InnoDB表必須建主鍵,并且推薦使用整型的自增主鍵?

4、為什么非主鍵索引結構葉子節點存儲的是主鍵值?

索引的本質是什么?

索引是幫助MySQL高效獲取數據的、排好序的數據結構。

數據結構

這里推薦一個網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(1)

網址樣式

1、二叉樹:索引有序時會產生鏈表。

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(2)

二叉樹-索引有序時會產生鏈表

2、紅黑樹:高度不可控,使用時多次磁盤IO (從根節點找到9,進行4次磁盤IO)

3、Hash:

1)、對索引key進行一次hash運算就可以定位出數據存儲的位置

2)、很多時候Hash索引比B 樹效率更高

3)、僅能滿足“=”,“IN”,無法支持范圍查詢。所以99.9%都不是Hash索引

4)、會產生Hash沖突

4、B Tree:

1)、葉節點具有相同的深度,葉節點的指針為空

2)、所有索引元素不重復

3)、節點中的數據索引從左到右遞增排列(有序)

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(3)

5、B Tree:MySQL使用B Tree作為索引的數據結構。(從根節點找到9,進行3次磁盤IO)

1)、非葉節點不存儲data,只存儲索引,可以放更多的索引。

2)、葉節點包含所有索引字段。

3)、葉子節點用指針鏈接,提高區間訪問的性能。

4)、數據索引遞增。

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(4)

B Tree

  • B Tree的一個節點大小為“1頁”,默認大小是16k(不建議修改,SHOW GLOBAL STATUS LIKE InnoDB page_size),對于大部分業務,一頁足夠。
  • 在B Tree中,非葉子節點存的是key 指針;葉子節點存的是數據行 指針。
  • 對于葉子節點,假設一行數據 指針大小為1k,那么一頁可以存放16條數據;對于非葉子節點,如果key使用的是bigint,則為8字節,指針在mysql中為6字節,一共是14字節,則16k能存放 16 * 1024 / 14 = 1170 個索引指針。對于高度為3的B Tree,可以存放 1170 x 1170 x 16 = 21902400 條數據,也就是對于兩千多萬條的數據,我們只需要高度為3的B 樹就可以完成,通過主鍵查詢只需要3次IO操作就能查到對應數據。所以在B Tree高度一般為3層時,就能滿足千萬級的數據存儲。
  • 如是使用B Tree,在存放2000萬數據時,樹的高度會遠大于3,因為B Tree的非頁節點包含數據data,每一層只能容納16條數據。
  • B Tree和B Tree的區別在于B Tree的非葉節點不包含data數據,B Tree的葉節點之間有指針。

熟悉完數據結構,下面看一下存儲引擎

MyISAM存儲引擎索引實現

MyISAM的索引文件和數據文件是分離的 – 非聚集(簇)索引

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(5)

MyISAM存儲引擎

葉子節點保存的data是數據所在行的磁盤文件地址,查找時,經過索引找到磁盤文件地址,根據地址可以直接去數據文件取出數據(回表)。

InnoDB存儲引擎索引實現

表數據文件本身就是按B Tree組織的一個索引結構文件 --聚集(簇)索引

主鍵索引的數據結構:

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(6)

葉子節點保存的data即是表中的數據,查找時,找到目標索引后可直接取出數據。

二級索引的數據結構:

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(7)

葉子節點保存的data的主鍵id,通過二級索引定位主鍵id,如果索引列包含查詢列,可以直接取出數據。否則通過主鍵id在主鍵索引中取出數據(回表)。

聯合索引:

mysql索引原理面試如何回答(關于MYSQL索引數據結構面試題剖析)(8)

聯合索引是二級索引的一種,按照索引順序排序。

問題:

1、存儲引擎是基于數據庫還是表的?

基于數據庫表的,在我們創建表時,可指定存儲引擎。

2、聚集(簇)索引和非聚集(簇)索引的區別是什么?

只需要記住一點,聚集(簇)索引的頁節點包含完整的數據記錄。

3、為什么建議InnoDB表必須建主鍵,并且推薦使用整型的自增主鍵?

如果設置了主鍵,那么InnoDB會選擇主鍵作為聚集索引。如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引。如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID(遞增)作為隱含的聚集索引。(我們能做的,就不麻煩MySQL)

使用自增主鍵的好處是每次插入新的記錄,記錄就會順序添加到當前索引節點的后續位置,主鍵的順序按照數據記錄的插入順序排列,自動有序。當一頁寫滿,就會自動開辟一個新的頁。如果無序的話要頻繁地調整數據接口。

4、為什么非主鍵索引結構葉子節點存儲的是主鍵值?

節省內存空間、一致性。

TAGS標簽:  mysql  索引  原理  面試  如何  mysql索引原理面

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖