更新時(shí)間:2022-12-29 14:19:54 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1766次
我們?cè)贘ava面試中,通常會(huì)碰到數(shù)據(jù)庫(kù)索引的知識(shí)點(diǎn),畢竟使我們重點(diǎn)需要掌握的技術(shù)知識(shí),當(dāng)然會(huì)被問到,索引是對(duì)數(shù)據(jù)庫(kù)表的一列或者多列的值進(jìn)行排序一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)表中的特定信息。那下面我們就給大家分享一些常見的數(shù)據(jù)庫(kù)索引面試題:

索引的好處?
快速查詢數(shù)據(jù)。
代價(jià)是什么?
索引需要占硬盤空間,這是空間方面的代價(jià)。
一旦插入新的數(shù)據(jù),就需要重新建索引,這是時(shí)間上的代價(jià)。
不同場(chǎng)景,不同對(duì)待。
場(chǎng)景一,數(shù)據(jù)表規(guī)模不大,就幾千行,即使不建索引,查詢語句的返回時(shí)間也不長(zhǎng),這時(shí)建索引的意義就不大。當(dāng)然,若就幾千行,索引所占的空間也不多,所以這種情況下,頂多屬于“性價(jià)比”不高。
場(chǎng)景二,某個(gè)商品表里有幾百萬條商品信息,同時(shí)每天會(huì)在一個(gè)時(shí)間點(diǎn),往其中更新大概十萬條左右的商品信息,現(xiàn)在用where語句查詢特定商品時(shí)(比如where name = ‘XXX’)速度很慢。為了提升查詢效率可以建索引,但當(dāng)每天更新數(shù)據(jù)時(shí),又會(huì)重建索引,這是要耗費(fèi)時(shí)間的。這時(shí)就需要綜合考慮,甚至可以在更新前刪除索引,更新后再重建。
場(chǎng)景三,因?yàn)樵跀?shù)據(jù)表里ID值都不相同,所以索引能發(fā)揮出比較大的作用。相反,如果某個(gè)字段重復(fù)率很高,如性別字段,或者某個(gè)字段大多數(shù)值是空(null),那么不建議對(duì)該字段建索引。

建立索引原則
一定是有業(yè)務(wù)需求了才會(huì)建索引。比如在一個(gè)商品表里,我們經(jīng)常要根據(jù)name做查詢,如果沒有索引,查詢速度會(huì)很慢,這時(shí)就需要建索引。但在項(xiàng)目開發(fā)中,如果不經(jīng)常根據(jù)商品編號(hào)查詢,那么就沒必要對(duì)編號(hào)建索引。
最后再?gòu)?qiáng)調(diào)一次,建索引是要付出代價(jià)的,沒事別亂建著玩,同時(shí)在一個(gè)表上也不能建太多的索引。
具體的例子來看索引的正確用法
語句一:select name from 商品表。不會(huì)用到索引,因?yàn)闆]有where語句。
語句二:select * from 商品表 where name = ‘Java書’,會(huì)用到索引,如果項(xiàng)目里經(jīng)常用到name來查詢,且商品表的數(shù)據(jù)量很大,而name值的重復(fù)率又不高,那么建議建索引。
語句三:select * from 商品表 where name like ‘Java%’ 這是個(gè)模糊查詢,會(huì)用到索引,請(qǐng)大家記住,用like進(jìn)行模糊查詢時(shí),如果第一個(gè)就是模糊的匹配符,比如where name like ‘%java’,那么在查詢時(shí)不會(huì)走索引。在其他情況下,不論用了多少個(gè)%,也不論%的位置,只要不出現(xiàn)在第一個(gè)位置,那么都能用到索引。
學(xué)生成績(jī)表里有兩個(gè)字段:姓名和成績(jī)?,F(xiàn)在對(duì)成績(jī)這個(gè)整數(shù)類型的字段建索引。
第一種情況,當(dāng)數(shù)字型字段遇到非等值操作符時(shí),無法用到索引。比如:
? select name from 學(xué)生成績(jī)表 where 成績(jī)>95 , 一旦出現(xiàn)大于符號(hào),就不能用到索引,為了用到索引,我們應(yīng)該改一下SQL語句里的where從句:where 成績(jī) in (96,97,98,99,100)
第二種情況,如果對(duì)索引字段進(jìn)行了某種左值操作,那么無法用到索引。
? 能用到索引的寫法:select name from 學(xué)生成績(jī)表 where 成績(jī) = 60
? 不能用到索引的寫法:select name from 學(xué)生成績(jī)表 where 成績(jī)+40 = 100
第三種情況,如果對(duì)索引字段進(jìn)行了函數(shù)操作,那么無法用到索引。
? 比如SQL語句:select * from 商品表 where substr(name) = ‘J’,我們希望查詢商品名首字母是J的記錄,可一旦針對(duì)name使用函數(shù),即使name字段上有索引,也無法用到。
看一些圖




非聚集索引和聚集索引的區(qū)別在于, 通過聚集索引可以查到需要查找的數(shù)據(jù), 而通過非聚集索引可以查到記錄對(duì)應(yīng)的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數(shù)據(jù)。
不管以任何方式查詢表, 最終都會(huì)利用主鍵通過聚集索引來定位到數(shù)據(jù), 聚集索引(主鍵)是通往真實(shí)數(shù)據(jù)所在的唯一路徑。
不少程序員對(duì)于索引是不陌生的,但如果要問起來,就不知道要怎么去解釋,對(duì)于高級(jí)程序員而言,面對(duì)面試,時(shí)敘說不好,那么在能力上會(huì)大打折扣,影響到面試官對(duì)我們能力上的判斷,在與同等能力上的面試者相比,優(yōu)勢(shì)會(huì)顯得更加的劣勢(shì),所以我們要對(duì)數(shù)據(jù)庫(kù)索引相關(guān)的Java面試題一定是要重視起來。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)