JAVA面試——數據庫
阿新 • • 發佈:2019-03-02
不可重復讀 數據庫事務 數據庫 可維護 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面試——數據庫