整理了一些最近的MySQL面試題
掃一掃免費獲取全部面試題
1.1. MySQL的binlog(主從複製機制)
開啟
-- 配置檔案中開啟
-- 開啟binlog
log_bin=ON
-- 指定名稱
log_bin_basename=/var/lib/mysql/mysql-bin
-- 索引名稱
log_bin_index=/var/lib/mysql/mysql-bin.index
mysql 使用binlog 實現主從複製
從庫中開啟執行緒去主庫中讀取binlog,然後同步從庫資料(就是執行binlog中的sql),從而實現主從複製
binlog 三種儲存模式
statement: 儲存每個sql語句到binlog 中,從庫拿去這些sql去執行
row:基於行模式,行更新之後就同步到從庫
mixed:混合模式,以上兩種方式混合
全部面試題+v:YDT929領取
1.2. InnoDB與MyISAM的區別
MyISAM的索引與行記錄是分開儲存的(非聚集索引)
InnoDB的主鍵索引與行記錄是儲存在一起的(聚集索引)
MyISAM 多用資料查詢,不建議做更新、刪除操作
InnoDB支援事務,MyISAM不支援事務
MyISAM不支援外來鍵,InnoDB支援外來鍵
1.3. 行鎖表鎖的區別
鎖定粒度:表鎖 > 行鎖
加鎖效率:表鎖 > 行鎖
衝突概率:表鎖 > 行鎖
併發效能:表鎖 < 行鎖
1.4. 樂觀鎖與悲觀鎖
樂觀鎖是指在操作一條資料時,認為不會發生衝突,不加鎖。在MySQL通常加一個version欄位來實現樂觀鎖,它是一種人為的方式
悲觀鎖是指沒次操作總任務會發生衝突,每一次操作都會先獲取鎖,MYSQL中S鎖和X鎖就是悲觀鎖的一種形式
1.5. 隔離級別是什麼,有什麼作用
在事務併發情況下,各個事務之間會出現幻讀(資料讀取條數不一致——>範圍查詢),可重複讀(事務內兩次讀取的資料不一致),髒讀(讀到事務未提交的資料)
1.6. 什麼情況下不會使用索引
在索引欄位上計算、函式、(自動or手動)型別轉換,會導致全表掃描,而不會使用索引
SELECT*FROMstaffsWHERELEFT(NAME,2)='lee'
使用(!=或者<>、is null,is not null )時也是用不到索引
like以萬用字元開頭('%James')mysql索引失效會變成全表掃描操作
字串不加單引號索引失效(出現隱式型別裝換到時索引失效)
SELECT*FROMstaffsWHEREname=2000
少用or,用它連線時會索引失效
1.7. 建立檢索的基本原則是什麼
頻繁作為查詢的條件的欄位應該建立索引
頻繁更新的欄位不適合建立索引:因為每次更新不單單是更新了記錄還會更新索引,加重IO負擔
Where條件裡用不到的欄位不建立索引
查詢中排序的欄位,排序欄位若通過索引去訪問將大大提高排序的速度
查詢中統計或者分組的欄位
經常增刪改的表不適合建立索引
離散性比較低的列不適合做索引(count(distinct col):count(col)的比例)
1.8. 查詢優化技巧
全值匹配我最愛,最左字首要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,範圍之後全失效;
LIKE百分寫最右,覆蓋索引不寫*;
不等空值還有OR,索引失效要掃用;
VAR引號不能丟,SQL高階也不難;
1.9. B+索引資料結構,和B樹的區別
B樹
每個節點都儲存key和data,所有節點組成這棵樹,並且葉子節點指標為null
遵守二叉樹的基本準則,每次插入資料或則刪除資料都會計算保持一個平衡(旋轉)
B+Tree(B樹加強版)
節點關鍵字搜尋採用閉合區間
非葉節點不儲存資料相關資訊,只儲存關鍵字和子節點的引用
關鍵字對應的資料儲存在葉子節點中
葉子節點是順序排列的,並且相鄰節點具有順序引用的關係
這種方式的好處就是快,效能更好
1.10. 事務四大特性(ACID)
原子性(Atomicity)
最小的工作單元,整個工作單元要麼一起提交成功,要麼全部失敗回滾
一致性(Consistency)
事務中操作的資料及狀態改變是一致的,即寫入資料的結果必須完全符合預設的規則, 不會因為出現系統意外等原因導致狀態的不一致
隔離性(Isolation)
一個事務所操作的資料在提交之前,對其他事務的可見性設定(一般設定為不可見)
永續性(Durability)
事務所做的修改就會永久儲存,不會因為系統意外導致資料的丟失
1.11. MVCC機制
Multiversion concurrency control (多版本併發控)
併發訪問(讀或寫)資料庫時,對正在事務內處理的資料做多版本的管理。以達到用來避免寫操作的堵塞,從而引發讀操作的併發問題。
解決了InnoDB的幻讀問題(RR隔離級別)
全部面試題+v:YDT929領取