數據庫面試題

數據庫面試題

DBS DBMS DB區別

  1. DBS 數據庫系統
  2. DBMS 數據庫管理系統
  3. DB 數據庫

數據庫系統dbs包括但不限於數據庫管理系統dbms和數據庫dbjava

MySQL存儲引擎

  1. InnoDB(默認):支持事物,表鎖,行鎖設計,支持外鍵
  2. MyISAM:不支持事物和表鎖設計,不支持外鍵

事物

  • 使用場景
  • 轉帳:mysql

    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(可串行化):最高的隔離級別,不能併發,解決了幻讀問題,會產生超時 鎖爭用問題

樂觀鎖與悲觀鎖

  • 悲觀鎖sql

    • 特徵(what):每次操做數據都會加鎖
    • 常見例子:mysql中行鎖 表鎖 讀鎖 寫鎖 ;java的中重量級鎖synchronized
  • 樂觀鎖數據庫

    • 特徵(what):操做數據時不加鎖
    • 實現方法(how):經過版本控制和cas算法實現
    • 優勢:適用於多讀的應用類型,能夠提升吞吐量
    • 常見例子:java中的原子變量類(cas算法)

MVCC多版本併發控制

  • 是啥(what):服務器

    • 能夠認爲是行級鎖的變種,他在不少狀況下避免加鎖,花銷更低
  • 分類:數據結構

    • 樂觀併發控制和悲觀併發控制
  • 實現(mysal的innodb引擎):併發

    • 經過在每行記錄後面保存兩個隱藏的列來實現,一個是保存行的建立時間,一個是保存行的過時時間。不過這裏的時間指的是系統版本號

死鎖(數據庫的)

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

併發控制

  • 解決問題:我在讀數據,你在刪數據的狀況
  • 鎖分類:mvc

    • 讀鎖:共享鎖,不阻塞
    • 寫鎖:排他鎖,排除其餘寫鎖和讀鎖。
  • 鎖策略

    • 解決問題:提升性能
    • 分類:

      表鎖:開銷最小
      行級鎖:最大程度支持併發,但開銷最大

範式分類

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

範式與反範式

  • 範式:

    • 優勢:

      更新比反範式快
      修改數據少
      表比較小,存在內存中,執行快
    • 缺點:

      須要關聯
  • 反範式:

    • 優勢:

      避免關聯
    • 缺點:

      信息冗餘

Char varchar

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

MySQL date、datetime和timestamp類型的區別

索引(書的目錄)

  • 解決問題(why):方便查找數據
  • 優勢:

    • 大大減小服務器須要掃描的數據量
    • 幫助服務器避免排序和臨時表
    • 將隨機io變成順序io
  • 缺點:

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

    • 最左前綴匹配原則,具體在聯合索引體現,mysql會一直向右匹配,當遇到範圍查詢會中止,此時把範圍查詢的索引放到最後便可
    • 常常做爲查詢的字段做爲索引
    • 更新頻繁的字段不適合作索引
    • 定義有外鍵的字段必定要作索引
    • 儘可能擴展索引,不要從新新建索引
  • 索引分類

    • 按底層數據結構分:

      b數索引(底層是b+數)
      哈希索引
      空間數據(r-tree)索引
      全文索引
    • 按邏輯分類

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

Group by

  • 後面接條件時用having
  • 通常與cout()函數一塊兒使用,實現查詢重複數據功能
  • 查重:

FX0qfO.png

  • 結果

FX0vXd.png

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

公衆號

  • 歡迎關注公衆號 布爾bl ,分享Java相關信息技術、生活感悟。

相關文章
相關標籤/搜索