更新時間:2022-12-29 14:19:54 來源:動力節點 瀏覽1235次
我們在Java面試中,通常會碰到數據庫索引的知識點,畢竟使我們重點需要掌握的技術知識,當然會被問到,索引是對數據庫表的一列或者多列的值進行排序一種結構,使用索引可以快速訪問數據表中的特定信息。那下面我們就給大家分享一些常見的數據庫索引面試題:
索引的好處?
快速查詢數據。
代價是什么?
索引需要占硬盤空間,這是空間方面的代價。
一旦插入新的數據,就需要重新建索引,這是時間上的代價。
不同場景,不同對待。
場景一,數據表規模不大,就幾千行,即使不建索引,查詢語句的返回時間也不長,這時建索引的意義就不大。當然,若就幾千行,索引所占的空間也不多,所以這種情況下,頂多屬于“性價比”不高。
場景二,某個商品表里有幾百萬條商品信息,同時每天會在一個時間點,往其中更新大概十萬條左右的商品信息,現在用where語句查詢特定商品時(比如where name = ‘XXX’)速度很慢。為了提升查詢效率可以建索引,但當每天更新數據時,又會重建索引,這是要耗費時間的。這時就需要綜合考慮,甚至可以在更新前刪除索引,更新后再重建。
場景三,因為在數據表里ID值都不相同,所以索引能發揮出比較大的作用。相反,如果某個字段重復率很高,如性別字段,或者某個字段大多數值是空(null),那么不建議對該字段建索引。
建立索引原則
一定是有業務需求了才會建索引。比如在一個商品表里,我們經常要根據name做查詢,如果沒有索引,查詢速度會很慢,這時就需要建索引。但在項目開發中,如果不經常根據商品編號查詢,那么就沒必要對編號建索引。
最后再強調一次,建索引是要付出代價的,沒事別亂建著玩,同時在一個表上也不能建太多的索引。
具體的例子來看索引的正確用法
語句一:select name from 商品表。不會用到索引,因為沒有where語句。
語句二:select * from 商品表 where name = ‘Java書’,會用到索引,如果項目里經常用到name來查詢,且商品表的數據量很大,而name值的重復率又不高,那么建議建索引。
語句三:select * from 商品表 where name like ‘Java%’ 這是個模糊查詢,會用到索引,請大家記住,用like進行模糊查詢時,如果第一個就是模糊的匹配符,比如where name like ‘%java’,那么在查詢時不會走索引。在其他情況下,不論用了多少個%,也不論%的位置,只要不出現在第一個位置,那么都能用到索引。
學生成績表里有兩個字段:姓名和成績。現在對成績這個整數類型的字段建索引。
第一種情況,當數字型字段遇到非等值操作符時,無法用到索引。比如:
? select name from 學生成績表 where 成績>95 , 一旦出現大于符號,就不能用到索引,為了用到索引,我們應該改一下SQL語句里的where從句:where 成績 in (96,97,98,99,100)
第二種情況,如果對索引字段進行了某種左值操作,那么無法用到索引。
? 能用到索引的寫法:select name from 學生成績表 where 成績 = 60
? 不能用到索引的寫法:select name from 學生成績表 where 成績+40 = 100
第三種情況,如果對索引字段進行了函數操作,那么無法用到索引。
? 比如SQL語句:select * from 商品表 where substr(name) = ‘J’,我們希望查詢商品名首字母是J的記錄,可一旦針對name使用函數,即使name字段上有索引,也無法用到。
看一些圖
非聚集索引和聚集索引的區別在于, 通過聚集索引可以查到需要查找的數據, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數據。
不管以任何方式查詢表, 最終都會利用主鍵通過聚集索引來定位到數據, 聚集索引(主鍵)是通往真實數據所在的唯一路徑。
不少程序員對于索引是不陌生的,但如果要問起來,就不知道要怎么去解釋,對于高級程序員而言,面對面試,時敘說不好,那么在能力上會大打折扣,影響到面試官對我們能力上的判斷,在與同等能力上的面試者相比,優勢會顯得更加的劣勢,所以我們要對數據庫索引相關的Java面試題一定是要重視起來。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習