1. 程式人生 > 其它 >面試前如何準備資料庫方面的說辭

面試前如何準備資料庫方面的說辭

    Java技術面試主要是圍繞Java核心、資料庫、Spring Boot框架和分散式元件這四個方面來提問,前文也講述了快速提升這四方面技能的技巧。在此基礎上,本文將在資料庫層面,給出準備面試說辭的方法。

1 全面準備不偏科,圍繞專案說亮點

    在相關面試說辭前,先給出準備說辭的技巧。

  1. 全面準備事務、索引、調優和快取分散式元件,別偏重一方面。如果你僅僅把其中一點說得天花亂墜,但其它點沒說好,面試官一定會認為你資料庫方面能力很差,想靠背題來矇混過關。
  2. 大多開發一般在面試前不準備,所以面試時只能展示增刪改查技能,所以你一定得準備調優和分散式元件相關說辭。
  3. 藥無需貴,對症即可,所以不需要準備其它諸如“MySQL底層”等說辭,就結合專案把本文給出的說辭說好即可,這樣你的資料庫技能就具備了“專案開發經驗”。  

2 資料庫方面必問的點

    如下問題屬於必考點,大家別抱有幻想,一定得準備。

  1.     說下JDBC有哪些元件?如何用JDBC物件訪問資料庫?   
  2.     事務是什麼?事務隔離級別和事務傳播機制是什麼?
  3.     用JPA(或Mybatis)操作資料庫會用到哪些物件和註解?
  4.     三正規化是什麼?你建表時會用到什麼原則?
  5.     左連線、外連線和內連線是什麼?

    上述問題大家能從網上找到答案,所以這裡就不展開了,不過除了上述基本問題外,資料庫方面你在面試時大概率還會被問到如下的問題。

  1.     索引底層資料結構?複合索引和最左匹配原則?如何通過索引優化sql語句?
  2.     專案裡你用過哪些資料庫的調優手段?你排查過哪些資料庫問題?
  3.     專案裡你用過哪些快取?    

    這些問題涉及到效能調優和快取分散式元件,不過根據我面試的情況,很多候選人基本都不會準備這些問題。而後文就將告訴你詳細的準備方式。

3 你有沒有用過索引?

    這個問題不問便罷,如果遇到,你可以按層次說出如下的說辭。

    在專案裡,我有用索引優化資料庫效能的經驗,同時也看過索引的底層結構。(先說明在專案裡用過)

    索引的底層結構是個B+樹,大致結構如下圖所示,所以它能用較快的效能找到資料。(找張紙畫出下圖,邊畫邊說,你自己可以想象這番說辭的分量)

    

    然後話鋒一轉再說,索引是需要消耗硬碟空間的,而且遇到大批量資料讀寫時,重建索引需要消耗代價,所以我們專案組用索引會非常謹慎。

    (面試官可能就會感興趣地再問,那你們是在哪些情況下用索引?這正中你下懷)

    只有當資料表規模很大,超過百萬,並且這個需要頻繁讀該欄位,且這個欄位空值和重複值不多時,才會對該欄位建索引。(這種情況才能最大發揮索引的價值)比如在訂單模組裡的訂單流水錶的“訂單ID”,符合上述情況,所以會建索引。(以專案舉例說明,證明你真的用過)

    (說到這裡別停,繼續往下說)建好索引以後,我在寫SQL會非常注意,比如orderID='xxx'和orderID like 'abc%'時,才會確保該條sql走索引,像orderID!='xxx'或遇到左值操作比如substr(orderID,3)='xxx'時,不會走索引,所以這種寫法我會避免。     

    說到這裡,面試官一般就會認為你具備基本的調優技能了,可能有些面試官還會再深入問,你知不知道“複合索引”?

    我知道,建複合索引需要考慮最左匹配原則,則(a,b,c)這種複合索引,遇到a=xx and b=xx,會走索引,但遇到b=xx的情況就不會走,同時建複合索引是為了避免因“回表”而導致的效能損耗。

    這樣一來面試官對你的好感又會再增一步。

4 你知不知道事務?

    我在專案裡用過事務。從理論上講,事務具有要麼全做要麼全不做的(acid)特性。

    (趕緊落實到專案)在專案裡,我們會在Spring的@Service類裡通過@Transactional註解來使用事務。(一般都這樣用的)

    同時會非常注意其中的事務隔離級別和事務傳播機制引數。(哪怕面試官真深入問,你由於準備過也不怕)

    (進一步涉及效能調優)在設定隔離級別時,我們不會調太高,比如絕不會用“讀未提交”,因為這樣的話,多條SQL來的時候會鎖表,會導致其它SQL處於等待狀態,但不釋放連線,從而會導致連線打滿,造成資料庫崩潰。(當你說出這番話時,面試官就會認為你有解決實際問題的經驗)。   

5 專案裡你用過哪些調優手段?

    你別僅侷限於此,你可以先說,我們專案裡,(mysql)資料庫是部署在linux上,其中一旦遇到執行時間超過10秒的sql,我們會收到郵件並分析問題。

    這樣一來你更回答了“如何監控以及哪些SQL需要調優”的問題,然後繼續往下說。

    遇到慢SQL後,我會用explain觀察執行計劃,看時間耗費在哪裡,大多數情況下是走了全表掃描,這就需要建索引,有時候兩個大表關聯也會導致慢sql,這就需要快取或重構表結構。在個別複雜的sql裡,會發現多個子查詢執行了多次,這就需要用with語句重構sql。(一般來說,索引,快取,with重構和重構表能解決大多數問題) 

    然後你再多說一句,在我們專案裡,一方面會盡可能優化單句SQL語句,另一方面還用到了Redis快取來優化效能,這樣就自然地把話題轉到更值錢的分散式元件上了。 

6 你有沒有用過快取?

    我們專案是用Redis作為快取,(把Redis融入專案,這樣就能證明具有專案經驗,不過前提是,你需要把Redis五種基本資料型別和讀寫方式看熟悉) ,再具體講,是用Jedis庫的lpush和lrange方法來讀寫Redis的列表物件(用具體的方法進一步證明你用過)。

    話鋒一轉講需求,證明有使用的必要。比如有個場景,訂單模組會經常向風控模組查詢公司的風控資訊,所以我們把訂單ID加字首作為鍵,把風控資訊存放列表裡返回。

    單純會用Redis的人不少,所以你還要進一步結合專案背景說明更高階的技能。

  1.  在用Redis快取風控資料時,需要用expire方法設定超時時間為1天左右,否則快取的資料會一直存在記憶體裡,導致OOM問題。
  2.  在設快取時,會加一個隨機時間,比如1天+(60秒內)隨機數,這樣同一批資料不會同時失效,造成某個時間段裡請求全湧向資料庫,導致資料庫壓力過大。
  3.  在快取資料時,更要快取空值和(出現3次以上的)不存在的風控ID值,這樣能避免這些請求穿透快取湧向資料庫,造成資料庫壓力過大。
  4.  專案裡是採用了MySQL主從+Redis主從的架構,這樣能避免因單點MySQL或Redis失效而導致的問題。
  5.  本專案的Redis採用AOF的方式持久化資料(事先了解下AOF和RDB持久化的說辭)。

    上述快取說辭再外帶你之前展示的資料庫索引,效能調優和事務等方面說辭,甚至能讓面試官認為你具備5年所有的開發經驗,因為很多高階開發在資料庫方面的面試表現,不過如此。     

7 大多數初級開發在資料庫方面的表現

    我最近面試過多位具有3年開發經驗的候選人,他們在資料庫方面的表現真的很一般。其實大家也可以思考下,如果你不準備,能否比他們回答得更好?

    “在Spring Boot裡,你怎麼連線資料庫?”,大多數候選人都能結合JPA註解很好說明。

    “你有沒有用過索引?”大多數候選人能說出通過索引能優化效能,我繼續問,“哪些場景下需要建索引?哪些SQL建了索引也無法用到?複合索引用過沒?”這些問題不少人就說不上了。

    事務概念大多知道,但我問“你們專案裡,用的事務隔離級別是哪個?為什麼?”能答出來的人就比較少了。 

    Redis方面,大多數人能講述基本資料結構以及Jedis的相關語法,但“快取空值防穿透”以及“設定超時時間防OOM”等資深技能,就很少有人能說好了。

    兩廂一比,如果你第一按本文給出的提示通過查資料熟悉正規化等概念,第二再結合專案很好地圍繞索引、事務、執行計劃性能調優和Redis快取展示技能,那麼至少在資料庫這方面,你就能比很多人強。

    當然除了資料庫以外,面試更會考Java核心和分散式元件等技能,在本系列的其它文章裡,還會給出準備其它方面面試說辭的技巧,敬請關注。