程式設計師的 MySQL 面試金典

2021-09-27 10:18:24 字數 3215 閱讀 3661

在面試前,有一句話請記住:

獲得高薪的關鍵:就是高效的準備面試

對於程式設計師來說,面試內容一般分為兩個部分:

程式設計面試題部分 + 資料庫面試題部分。

基於這個原則,我和汽車之家的資深技術專家老張,也是一位有著 10 年工作經驗的技術老兵,前前後後大概花了兩個多月的時間,改了 6 個版本,最終總結了 200 道左右的 mysql 面試題,來幫助準備面試的朋友們。

對於技術面試來說,考察的核心包含以下兩個特點:

考察的知識點廣,因為不同的公司和不同的面試官技能知識結構是不同的,所以關注的問題和面試內容也是不同的,因而具備面試知識點廣的特點;

考察的知識點較深入,以阿里巴巴為例,這些大廠的面試都是類似的,通常從乙個大的面試點切入,然後層層深入,直到你不能接招為止。比如,你了解哪些資料庫引擎?這個資料庫引擎的特點是什麼?這個資料庫引擎是如何儲存資料的?為什麼要採用這種儲存方式?等。

所以針對以上兩個問題,我和老張結合自己 10 餘年的工作和面試的經驗,經過討論和修改,最終制定了8 大模組,彙總並介紹 mysql 中的典型面試問題,它包含的內容如下:

對應的知識圖譜如下:

老王:資深面試官/阿里雲社群認證專家十餘年程式設計從業經驗,現上市公司技術研發經理,曾就職於 360,有著豐富的大型系統設計、開發和調優的經驗,在不斷探索和學習的過程中,積累了寶貴的程式設計與面試經驗。

張建:十餘年程式設計從業經驗/現任上市公司專案經理曾就職新華保險通訊事業部、汽車之家。有著豐富的工業製造系統、呼叫中心、網際網路系統設計、開發和調優經驗。曾主導設計並參與了汽車之家二手車bu單體應用微服務化改造,有著豐富的微服務架構經驗。

課程內容

mysql 事務的面試題總結事務是一系列的資料庫操作,是資料庫應用的基本單位。mysql 事務主要用於處理操作量大,複雜度高的資料。

在 mysql 中只有 inndb 引擎支援事務,它的四個特性如下:

mysql 中有四種事務隔離級別,它們分別是:

mysql 預設使用 repeatable-read 的事務隔離級別。

併發事務可能造成:髒讀、不可重複讀和幻讀等問題 ,這些問題其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決,解決方案如下:

mvcc 全稱是多版本併發控制系統,innodb 和 falcon 儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決幻讀問題。

innodb 的 mvcc 是通過在每行記錄後面儲存兩個隱藏的列來實現,這兩個列乙個儲存了行的建立時間,乙個儲存行的過期時間(刪除時間)。當然儲存的並不是真實的時間而是系統版本號(system version number)。每開始乙個新的事務,系統版本號都會自動新增,事務開始時刻的系統版本號會作為事務的版本號,用來查詢到每行記錄的版本號進行比較。

事務的實現是基於資料庫的儲存引擎,不同的儲存引擎對事務的支援程度不一樣。mysql 中支援事務的儲存引擎有innodb 和 ndb。innodb 是高版本 mysql 的預設的儲存引擎,因此就以 innodb 的事務實現為例,innodb 是通過多版本併發控制(mvcc,multiversion concurrency control )解決不可重複讀問題,加上間隙鎖(也就是併發控制)解決幻讀問題。因此 innodb 的 rr 隔離級別其實實現了序列化級別的效果,而且保留了比較好的併發效能。事務的隔離性是通過鎖實現,而事務的原子性、一致性和永續性則是通過事務日誌實現。

mysql 事務隔離級別 mysql.cnf 檔案裡設定的(預設目錄 /etc/my.cnf),在檔案的文末新增配置:

transaction-isolation = repeatable-read

可用的配置值:read-uncommitted、read-committed、repeatable-read、serializable。

innodb 預設的事務隔離是 repetable read(可重複讀);可以通過set 作用域 transaction isolation level 事務隔離級別來修改事務的隔離級別,比如:

mysql> set global transaction isolation level read committed; // 設定全域性事務隔離級別為 read committed

mysql> set session transaction isolation level read committed; // 設定當前會話事務隔離級別為 read committed

innodb 預設是自動提交事務的,每一次 sql 操作(非 select 操作)都會自動提交乙個事務,如果要手動開啟事務需要設定set autocommit=0禁止自動提交事務,相當於開啟手動提交事務。

autocommit=0 表示禁止自動事務提交,在新增操作之後沒有進行手動提交,預設情況下其他連線客戶端是查詢不到此條新增資料的。

使用 begin 開啟事務;rollback 回滾事務;commit 提交事務。具體使用示例如下:

begin;insert person(uname,age) values('laowang',18);rollback;commit;
mysql 基礎模組的面試題總結mysql 索引的面試題總結mysql 中鎖的面試題總結

mysql 中日誌的面試題總結

mysql 命令和內建函式

mysql 效能優化 & 分布式

mysql 常見的開放性問題

閱讀全文:

程式設計師面試金典

1.有個小孩正在上樓梯,樓梯有n階台階,小孩一次可以上1階 2階 3階。請實現乙個方法,計算小孩有多少種上樓的方式。為了防止溢位,請將結果mod 1000000007 給定乙個正整數intn,請返回乙個數,代表上樓的方式數。保證n小於等於100000。int countways int n retu...

程式設計師面試金典 2 2

return kth to last 返回單鏈表中倒數第k個元素。下面會分別使用遞迴和非遞迴的方法來解決這道題,一般來說遞迴的方法寫起來更容易,但是效率一般不是最好的,比如這道題遞迴解法的 量大約是非遞迴解法的一半,但是時間複雜度依然是o n 遞迴解法。這種方法的本質是先遍歷到鍊錶尾部,最後再返回的...

程式設計師面試金典 2 4

partition 編寫 將鍊錶中小於x的元素放在鍊錶的前半部分,大於x的元素放在鍊錶的後半部分,沒有順序要求。如果是陣列的話,根據x對陣列進行劃分的方法類似於快排。對於鍊錶會更簡單一些,可以直接將原始鍊錶拆分為兩個鍊錶,乙個中所有元素比x小,乙個中所有元素比x大,最後再進行連線。通過在鍊錶中使用b...