開發面試(PHP、Java、Python)之Mysql篇(一)

作為一名從事php,java、python等服務端開發人員,資料庫的開發是必修課,本系列就從面試角度來看看,需要掌握到什麼程度才算好;

現在大家的時間都是碎片化,寫太多也看不下去,就拆成短篇,一一奉上,中間摻雜一些作為面試官的建議(僅供參考);

1)mysql你預設選擇什麼編碼?基礎問題

這道題考究的是 utf-8,utf8mb4,能側面反應人員的經驗;原因:MySQL 的“utf8”只支援每個字元3個位元組,而不是4位元組,關鍵是MySQL 一直沒有去想過改進這一點,在 2010 年釋出了一個叫作“utf8mb4”的字符集,繞過了這個問題,奇怪的是,他們並沒有對這個事進行宣傳,難道是家醜不可外揚?其實採用utf-8一般也沒啥事兒,不過你要是不小心存入個表情符什麼的,報錯就少不了了。

2)怎麼審查一條sql語句的執行情況;基礎問題

描述下 EXPLAIN 命令:透過命令檢視sql的執行計劃,能檢視到有沒有生效的索引,有沒有做全表掃描等,讓我們可以深入瞭解MySQL的基於開銷的最佳化器,還可以獲得很多可能被最佳化器考慮到的訪問策略的細節,以及當執行SQL語句時哪種策略預計會被最佳化器採用。

id:選擇識別符號;

select_type:表示查詢的型別;

table:輸出結果集的表;

partitions:匹配的分割槽;

type:表示表的連線型別;

possible_keys:表示查詢時,可能使用的索引;

key:表示實際使用的索引;

key_len:索引欄位的長度;

ref:列與索引的比較;

rows:掃描出的行數(估算的行數);

filtered:按表條件過濾的行百分比;

Extra:執行情況的描述和說明;

3)接著上一題,sql哪些情況下會讓索引失效?

模糊查詢 like %在前,不包含,不等於(大於,小於會不會呢?),or,對索引列做了函式運算等等。

索引到底有沒有失效,不斷嘗試改造sql去執行,看explain的結果,能加深理解;

4)關於mysql的鎖;這個比較考驗綜合能力;

這個問題可以有很多種問法,例如:說說mysql有哪些鎖;談一下行鎖、表鎖、樂觀鎖、悲觀鎖、讀鎖,寫鎖;

回答的時候 當然不是隻把名詞說一遍,能接著把鎖的型別,鎖的粒度以及應用結合專案例項順利的表達出來,而不是擠牙膏,那麼,恭喜你,加分;當然任何事情都有個度,別說過了,如果是較大公司的面試,面試官會根據你的回答,不斷的深入問題進行詢問,言多必失。

mysql按操作可以分為 讀鎖、寫鎖;

按粒度來分:行鎖,表鎖,頁鎖(不常見,innodb不用);而這些又與採用的引擎息息相關;如果此處能把 MyISAM,InnoDB引擎與鎖相關的機制大致表述一下就更好了;

從邏輯概念上又可以分:樂觀鎖、悲觀鎖;

樂觀鎖與mysql沒太多關係,而是與程式實現有關係,常見的實現方式是透過版本號或者是比對預期值。簡單形容樂觀鎖就是更新資料樂觀的認為不會有衝突,不強制加鎖,更新的時候透過資料版本來判斷是否衝突了。

與之對應的就是悲觀鎖,就是認為更新會有衝突,因此限定必須先獲取鎖才能更新。

悲觀鎖又會引申出 排它鎖,共享鎖;

排它鎖:一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的任何鎖,只有獲取排他鎖的事務是可以對資料就行讀取和修改。

共享鎖:多個事務共享一把鎖,能讀,只有獲得鎖的事務能寫;

顯然,悲觀鎖涉及到mysql的事務及鎖機制,效率不會高,應對高併發場景,多想想怎麼實現樂觀鎖;

綜合題結合專案業務來談,能充分顯示你的專案經驗與思考;

開發面試(PHP、Java、Python)之Mysql篇(一)