1. 程式人生 > >資料庫常見過冬面試題

資料庫常見過冬面試題

資料庫面試題

 

 

DBS DBMS DB區別

  1. DBS 資料庫系統
  2. DBMS 資料庫管理系統
  3. DB 資料庫

資料庫系統dbs包括但不限於資料庫管理系統dbms和資料庫db

MySQL儲存引擎

  1. InnoDB(預設):支援事物,表鎖,行鎖設計,支援外來鍵
  2. MyISAM:不支援事物和表鎖設計,不支援外來鍵

事物

  • 使用場景

  • 轉賬:

    1. a轉賬給b,a賬戶減少
    2. b賬戶增加
    3. 過程就要用到事物,轉賬事物就回滾
  • 解釋:一組原子性的SQL查詢(結合ACID)

  • ACID特性

    • A:原子性
    • C:一致性
    • I:隔離性
    • D:永續性
  • 隔離級別(低到高)

    1. read uncommitted(未提交讀)
    2. read committed(提交讀):大多數資料庫預設的級別
    3. repeatable read (可重複讀):mysql預設級別,解決了髒讀問題,InnoDB通過mvcc可解決幻讀問題
    4. serializable(可序列化):最高的隔離級別,不能併發,解決了幻讀問題,會產生超時 鎖爭用問題

樂觀鎖與悲觀鎖

  • 悲觀鎖
    • 特徵(what):每次操作資料都會加鎖
    • 常見例子:mysql中行鎖 表鎖 讀鎖 寫鎖 ;java的中重量級鎖synchronized
  • 樂觀鎖
    • 特徵(what):操作資料時不加鎖
    • 實現方法(how):通過版本控制和cas演算法實現
    • 優點:適用於多讀的應用型別,可以提高吞吐量
    • 常見例子:java中的原子變數類(cas演算法)

MVCC多版本併發控制

  • 是啥(what):
    • 可以認為是行級鎖的變種,他在很多情況下避免加鎖,花銷更低
  • 分類:
    • 樂觀併發控制和悲觀併發控制
  • 實現(mysal的innodb引擎):
    • 通過在每行記錄後面儲存兩個隱藏的列來實現,一個是儲存行的建立時間,一個是儲存行的過期時間。不過這裡的時間指的是系統版本號

死鎖(資料庫的)

  • 解釋現象:兩個或兩個以上事務在同一資源相互佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。

併發控制

  • 解決問題:我在讀資料,你在刪資料的情況
  • 鎖分類:
    • 讀鎖:共享鎖,不阻塞
    • 寫鎖:排他鎖,排除其他寫鎖和讀鎖。
  • 鎖策略
    • 解決問題:提高效能
    • 分類:
      > 表鎖:開銷最小
      > 行級鎖:最大程度支援併發,但開銷最大

正規化分類

  1. 1nf:屬性具有原子性
  2. 2nf:在1nf基礎上消除非主屬性對主碼的部分依賴
  3. 3nf:在2nf基礎上消除傳遞依賴

正規化與反正規化

  • 正規化:

    • 優點:

      更新比反正規化快
      修改資料少
      表比較小,存在記憶體中,執行快

    • 缺點:
      > 需要關聯

  • 反正規化:

    • 優點:

      避免關聯

    • 缺點:

      資訊冗餘

Char varchar

  • Char是定長 剩餘空間會用空格填充
  • Varchar是可變長

MySQL date、datetime和timestamp型別的區別

  • https://zhuanlan.zhihu.com/p/23663741

索引(書的目錄)

  • 解決問題(why):方便查詢資料

  • 優點:

    • 大大減少伺服器需要掃描的資料量
    • 幫助伺服器避免排序和臨時表
    • 將隨機io變成順序io
  • 缺點:

    • 時間:建立索引,維護索引需要時間
    • 空間:建立索引佔用物理空間
  • 建立索引的原則

    • 最左字首匹配原則,具體在聯合索引體現,mysql會一直向右匹配,當遇到範圍查詢會停止,此時把範圍查詢的索引放到最後即可
    • 經常作為查詢的欄位作為索引
    • 更新頻繁的欄位不適合做索引
    • 定義有外來鍵的欄位一定要做索引
    • 儘量擴充套件索引,不要重新新建索引
  • 索引分類

    • 按底層資料結構分:

      b數索引(底層是b+數)
      雜湊索引
      空間資料(r-tree)索引
      全文索引

    • 按邏輯分類

      主鍵索引(特殊的唯一索引,不允許null值)
      單列索引
      多列索引
      唯一索引
      空間索引

Group by ###

  • 後面接條件時用having
  • 一般與cout()函式一起使用,實現查詢重複資料功能
  • 查重:
    FX0qfO.pngFX0qfO.png
  • 結果
    FX0vXd.pngFX0vXd.png

分頁查詢(limit(mysql) top(sqlserver))

  • 練習:
    https://www.nowcoder.com/practice/f24966e0cb8a49c192b5e65339bc8c03?tpId=82&tqId=29823&tPage=3&rp=&ru=/ta/sql&qru=/ta/sql/question-ranking

  • 解釋:limit x, y 表示從x+1行(x從0開始算)開始查詢y條資料

公眾號

  • 歡迎關注公眾號 布林bl ,分享Java相關資訊科技、生活感悟。