1. 程式人生 > >JAVA面試——數據庫

JAVA面試——數據庫

不可重復讀 數據庫事務 數據庫 可維護 tps 鎖定 獨占鎖 stat binlog

    • 基礎:
      • 基本存儲結構:頁(大小16KB)
      • 各個數據頁組成雙向鏈表,每個數據頁的記錄組成單向鏈表
    • 索引:
      • 數據庫中一個或幾個列以特定數據結構存儲(B-Tree Hash),減少查找時間(將無序的數據變成有序)
    • 聚簇索引 & 非聚簇索引:
      • 按照數據存放的物理位置為順序,提高多行檢索速度
      • 加快單行檢索
    • 聚集索引 & 非聚集索引:
      • 聚集索引:
        • 以主鍵創建的索引
        • 葉子節點存放表中數據
      • 非聚集索引
        • 以非主鍵創建的索引
        • 葉子節點存放主鍵和索引列
        • 覆蓋索引:把要查詢出來的列和索引是對應的(主鍵+值)
    • 唯一索引 & 主鍵索引 & 聚集索引:
      • 不允許兩行具有相同索引值的索引
      • 主鍵值唯一,使用主鍵進行索引時,允許對數據的快速訪問
      • 行的物理順序與邏輯順序相同,數據訪問速度更快
    • B-樹(平衡多路查找樹)
      • 每個節點最多有m個分支
      • 節點有n-1個關鍵字,有n個分支
      • 葉子節點處於同一層
      • 根節點不是葉子節點至少2個分支,非根非葉子節點至少有ceil(m/2)個分支
    • B+樹
      • 分支數=索引數
      • 每個節點大小等於一頁的大小(16KB)
      • 順序掃描速度快
      • 通過順序訪問指針提高區間查詢性能
      • 磁盤預讀特性,相鄰節點預先載入
      • InnoDB B+Tree索引:主索引、輔助索引
        • 主索引:葉子節點data域記錄完整數據記錄,聚簇索引
        • 輔助索引:葉子節點data域記錄主鍵值
    • 哈希索引
      • 鍵值換算成新的哈希值,根據哈希值定位
      • 不適合範圍查詢檢索
      • 無法利用索引完成排序
      • 不適合多列聯合索引的最左匹配規則
        • 最左匹配規則:復合索引,會首先對最左邊的數據進行排序,一直向右匹配直到遇到範圍查詢
    • 數據庫事務:
      • 作為單個邏輯工作單元執行的一系列操作
      • 提供隔離方法,防止相互幹擾
      • 提供從失敗恢復正常的方法
      • ACID
    • 數據庫隔離級別:
      • 臟讀
        • A讀取B已經更新但是未提交的事務,B回滾後A讀到的就是臨時無效的內容
      • 不可重復讀
        • A事務需要讀取一個字段兩次,兩次讀取過程中,B更新了字段,導致A兩次讀取的內容值不同
      • 幻讀
        • A讀取若幹行數據,B插入或刪除等方式修改A讀取的結果集;與不可重復讀的區別在於,幻讀是增加或刪除行,不可重復讀是修改
      • 四個隔離級別
        • 讀未提交(臟讀)
        • 讀已提交(不可重復讀)、語句級別的快照
        • 可重復讀(幻讀)事務級別的快照
        • 串行:事務一個接一個串行執行,不能並發
    • 鎖的種類
      • 技術分享圖片
      • 內容
        • 表鎖(MySQL)
        • 頁鎖(BerkeleyDBA)
        • 行鎖(InnoDB)
      • 性質
        • 共享鎖(S) :SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
        • 獨占鎖、排他鎖(X):SELECT * FROM table_name WHERE ... FOR UPDATE
        • 更新鎖(意向鎖)
      • 悲觀鎖與樂觀鎖
        • 悲觀鎖
          • 數據處理過程中,數據處於鎖定狀態
          • 依靠數據庫的鎖機制
          • 舉例:select * from xxx for update (for update相當於加排他鎖)
        • 樂觀鎖
          • 悲觀鎖性能開銷大(長事務)
          • 基於數據版本
      • 間隙鎖GAP
        • 對符合條件範圍內的已有數據記錄的索引項加鎖,同時也會對間隙加鎖
        • 在可重復讀隔離級別下使用
        • 防止幻讀
    • 數據庫範式:
      • 第一範式:強調列的原子性,列不能拆分
      • 第二範式:一個表有一個主鍵,沒有包含在主鍵中的列完全依賴於主鍵
      • 第三範式:非主鍵列必須直接依賴於主鍵,不能存在傳遞以來
    • PrepareStatement & Statement區別
      • PrepareStatement預編譯後放在緩存中,下次執行無需編譯,更加安全,避免SQL註入
      • 優點:
        • 防註入攻擊
        • 多次執行速度快
        • 防止數據庫緩沖區溢出
        • 代碼可維護性高
      • 技術分享圖片
    • 內連接(inner join)、左外連接(left outer join)、右外鏈接(right outer join)、自然連接
    • 數據庫緩存性能優化:
      • 將磁盤IO轉化為內存IO
      • Query cache:
        • 針對select,緩存ResultSet
        • 對sql語句hash,在query cache中找緩存
        • 數據變化頻繁時效率低
      • binlog cache size:
        • 二進制日誌記錄

JAVA面試——數據庫