Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
688
2022-05-28
大家好,我是陳哈哈,北漂五年。相信大家和我一樣,都有一個大廠夢,作為一名資深Java選手,深知面試重要性,接下來我準(zhǔn)備用100天時間,基于Java崗面試中的高頻面試題,以每日3題的形式,帶你過一遍熱門面試題及恰如其分的解答。
一路走來,隨著問題加深,發(fā)現(xiàn)不會的也愈來愈多。但底氣著實(shí)足了不少,相信不少朋友和我一樣,日積月累才是最有效的學(xué)習(xí)方式!想起高三時一個同學(xué)的座右銘:只有沉下去,才能浮上來。共勉(juan)。
煙花臺風(fēng)來之前的上海,江浙滬各地的老鐵們,保重!
車票
面試題1:說一下你對聚集索引與非聚集索引的理解,以及他們的區(qū)別?
追問1:為什么聚集索引可以創(chuàng)建在任何一列上,如果此表沒有主鍵約束,即有可能存在重復(fù)行數(shù)據(jù)呢?
追問2:聚集索引一定比非聚集索引性能優(yōu)么?
面試題2:說一說你對 B樹 和 B+樹 的理解吧
面試題3:說一下你對最左前綴原則的理解吧
每日小結(jié)
本欄目Java開發(fā)崗高頻面試題主要出自以下各技術(shù)棧:Java基礎(chǔ)知識、集合容器、并發(fā)編程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL數(shù)據(jù)庫、Redis緩存、RabbitMQ消息隊(duì)列、Linux操作技巧等。
面試題1:說一下你對聚集索引與非聚集索引的理解,以及他們的區(qū)別?
首先解釋一下,什么是聚集索引和非聚集索引。這里我想起網(wǎng)上看到的一個典型的例子:
說索引像一個漢語字典,聚集索引是根據(jù)拼音查詢,而非聚集索引是根據(jù)偏旁部首查詢,你想想哪個查的快?
漢語字典的正文本身就是一個聚集索引。比如,我們要查“啊”字,拼音是“a”,按照拼音排序是以“a”開頭“z”結(jié)尾的,那么“啊”字就自然地排在字典的前部。如果翻完了所有以“a”開頭的內(nèi)容仍然找不到這個字,那么就說明字典中就沒有這個字。我們知道,其實(shí)字典的正文部分本身就是一個目錄,不需要再去查其他目錄來找到我們需要找的內(nèi)容。我們把這種正文內(nèi)容本身就按照一定規(guī)則排列(有序)的目錄稱為“聚集索引”。
問題來了,遇到不認(rèn)識的字,不知道它的發(fā)音,怎么辦?
這時候,就得用“偏旁部首”查了吧,然后根據(jù)這個偏旁后的頁碼來找字。這種結(jié)合“部首目錄”和“檢字表”查到的字的排序并不是真正的正文的排序方法,比如查“張”字,我們可以看到在查部首之后的檢字表中“張”的頁碼是672頁,檢字表中“張”的上面是“馳”字,但頁碼卻是63頁,“張”的下面是“弩”字,頁面是390頁。很顯然,這些字并不是真正的分別位于“張”字的上下方,現(xiàn)在看到的連續(xù)的“馳、張、弩”三字實(shí)際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。
我們可以通過這種方式來找到我們所需要的字,但它需要兩個過程,先找到目錄中的結(jié)果,然后再翻到相應(yīng)頁碼。我們把這種目錄純粹是目錄,正文純粹是正文的排序方式(無序)稱為“非聚集索引”。
1、聚集索引
聚集索引是我們常用的一種索引,該索引中鍵值的邏輯順序決定了表中相應(yīng)行的物理順序,我們?nèi)~子結(jié)點(diǎn)直接對應(yīng)的實(shí)際數(shù)據(jù),當(dāng)索引值唯一(unique)時,使用聚集索引查找特定的行效率很高。例如,使用唯一店員 ID 列 emp_id 查找特定雇員的最快速的方法,是在 emp_id 列上創(chuàng)建聚集索引或 PRIMARY KEY 約束。可見,自增主鍵就是一個標(biāo)準(zhǔn)的聚集索引。
當(dāng)某列滿足兩個條件時,我們可以創(chuàng)建聚集索引:
數(shù)據(jù)存儲有序(如自增)
key值應(yīng)當(dāng)唯一
聚簇索引像字典,字典按字母順序排列數(shù)據(jù),有序。在聚集索引中,索引包含指向數(shù)據(jù)存儲的塊而不是數(shù)據(jù)存儲地址的指針,和非聚集索引(Normal)相反。
2、非聚集索引
非聚集索引就是索引類型為Normal的普通索引啦,我們在《聊聊MySQL索引“B+Tree”的前世今生》這篇文章中提到,B+Tree(這里是索引類型是Normal)所有關(guān)鍵字存儲在葉子節(jié)點(diǎn),但不存儲真正的data,葉子結(jié)點(diǎn)存的是一個指向磁盤data的指針,需要到磁盤數(shù)據(jù)頁中取。
非聚集索引的數(shù)據(jù)存儲在一個位置,索引存儲在另一位置。由于數(shù)據(jù)和非聚集索引是分開存儲的,因此在一個表中可以有多個非聚集索引。
聚集索引 和 非聚集索引的區(qū)別:
單表中只能有一個聚集索引,而非聚集索引單表可以存在多個。
聚集索引,索引中鍵值的邏輯順序決定了表中相應(yīng)行的物理順序;非聚集索引,索引中索引的邏輯順序與磁盤上行的物理存儲順序不同。
索引是通過二叉樹的數(shù)據(jù)結(jié)構(gòu)來描述的,我們可以這么理解聚簇索引:索引的葉節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn)
Java 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。