通過阿里面試前,必會的MySQL精華100問,你能答對幾道

前幾天有人跟我說mysql不行了?

簡直就是在吹牛,怎麼可能呢?去搜搜面試經驗和崗位要求就知道,mysql熟練肯定是必須項。

因此我決定搞一個MySQL靈魂100問,試著用回答問題的方式,讓各位對知識點的理解更加深入一點.

此文不會事無鉅細的從select的用法開始講解mysql,主要針對的是開發人員需要知道的一些MySQL的知識點,主要包括索引,事務,優化等方面,以在面試中高頻的問句形式給出答案.

這些也是面試阿里、騰訊等大廠經常會問到的知識,學會這些,跳槽漲薪還遠嗎?

通過阿里面試前,必會的MySQL精華100問,你能答對幾道


索引相關

關於MySQL的索引,曾經進行過一次總結,文章鏈接在這裡 Mysql索引原理及其優化.

1. 什麼是索引?

索引是一種數據結構,可以幫助我們快速的進行數據的查找.

2. 索引是個什麼樣的數據結構呢?

索引的數據結構和具體存儲引擎的實現有關, 在MySQL中使用較多的索引有Hash索引,B+樹索引等,而我們經常使用的InnoDB存儲引擎的默認索引實現為:B+樹索引.

3. Hash索引和B+樹所有有什麼區別或者說優劣呢?

首先要知道Hash索引和B+樹索引的底層實現原理:

hash索引底層就是hash表,進行查找時,調用一次hash函數就可以獲取到相應的鍵值,之後進行回表查詢獲得實際數據.B+樹底層實現是多路平衡查找樹.對於每一次的查詢都是從根節點出發,查找到葉子節點方可以獲得所查鍵值,然後根據查詢判斷是否需要回表查詢數據.

那麼可以看出他們有以下的不同:

  • hash索引進行等值查詢更快(一般情況下),但是卻無法進行範圍查詢.

因為在hash索引中經過hash函數建立索引之後,索引的順序與原順序無法保持一致,不能支持範圍查詢.而B+樹的的所有節點皆遵循(左節點小於父節點,右節點大於父節點,多叉樹也類似),天然支持範圍.

  • hash索引不支持使用索引進行排序,原理同上.
  • hash索引不支持模糊查詢以及多列索引的最左前綴匹配.原理也是因為hash函數的不可預測.AAAAAAAAB的索引沒有相關性.
  • hash索引任何時候都避免不了回表查詢數據,而B+樹在符合某些條件(聚簇索引,覆蓋索引等)的時候可以只通過索引完成查詢.
  • hash索引雖然在等值查詢上較快,但是不穩定.性能不可預測,當某個鍵值存在大量重複的時候,發生hash碰撞,此時效率可能極差.而B+樹的查詢效率比較穩定,對於所有的查詢都是從根節點到葉子節點,且樹的高度較低.

因此,在大多數情況下,直接選擇B+樹索引可以獲得穩定且較好的查詢速度.而不需要使用hash索引.

4. 上面提到了B+樹在滿足聚簇索引和覆蓋索引的時候不需要回表查詢數據,什麼是聚簇索引?

5. 非聚簇索引一定會回表查詢嗎?

6. 在建立索引的時候,都有哪些需要考慮的因素呢?

7. 聯合索引是什麼?為什麼需要注意聯合索引中的順序?

8. 創建的索引有沒有被使用到?或者說怎麼才可以知道這條語句運行很慢的原因?

9. 那麼在哪些情況下會發生針對該列創建了索引但是在查詢的時候並沒有使用呢?


通過阿里面試前,必會的MySQL精華100問,你能答對幾道


事務相關

1. 什麼是事務?

理解什麼是事務最經典的就是轉賬的栗子,相信大家也都瞭解,這裡就不再說一邊了.

事務是一系列的操作,他們要符合ACID特性.最常見的理解就是:事務中的操作要麼全部成功,要麼全部失敗.但是隻是這樣還不夠的.

2. ACID是什麼?可以詳細說一下嗎?

A=Atomicity

原子性,就是上面說的,要麼全部成功,要麼全部失敗.不可能只執行一部分操作.

C=Consistency

系統(數據庫)總是從一個一致性的狀態轉移到另一個一致性的狀態,不會存在中間狀態.

I=Isolation

隔離性: 通常來說:一個事務在完全提交之前,對其他事務是不可見的.注意前面的通常來說加了紅色,意味著有例外情況.

D=Durability

持久性,一旦事務提交,那麼就永遠是這樣子了,哪怕系統崩潰也不會影響到這個事務的結果.

3. 同時有多個事務在進行會怎麼樣呢?

多事務的併發進行一般會造成以下幾個問題:

  • 髒讀: A事務讀取到了B事務未提交的內容,而B事務後面進行了回滾.
  • 不可重複讀: 當設置A事務只能讀取B事務已經提交的部分,會造成在A事務內的兩次查詢,結果竟然不一樣,因為在此期間B事務進行了提交操作.
  • 幻讀: A事務讀取了一個範圍的內容,而同時B事務在此期間插入了一條數據.造成"幻覺".

4. 怎麼解決這些問題呢?MySQL的事務隔離級別瞭解嗎?

5. Innodb使用的是哪種隔離級別呢?

6. 對MySQL的鎖瞭解嗎?

7. MySQL都有哪些鎖呢?像上面那樣子進行鎖定豈不是有點阻礙併發效率了?

表結構設計

1. 為什麼要儘量設定一個主鍵?

2. 主鍵使用自增ID還是UUID?

3. 字段為什麼要求定義為not null?

4. 如果要存儲用戶的密碼散列,應該使用什麼字段進行存儲?

密碼散列,鹽,用戶身份證號等固定長度的字符串應該使用char而不是varchar來存儲,這樣可以節省空間且提高檢索效率.


通過阿里面試前,必會的MySQL精華100問,你能答對幾道


存儲引擎相關

1. MySQL支持哪些存儲引擎?

MySQL支持多種存儲引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多數的情況下,直接選擇使用InnoDB引擎都是最合適的,InnoDB也是MySQL的默認存儲引擎.

InnoDB和MyISAM有什麼區別?

  • InnoDB支持事物,而MyISAM不支持事物
  • InnoDB支持行級鎖,而MyISAM支持表級鎖
  • InnoDB支持MVCC, 而MyISAM不支持
  • InnoDB支持外鍵,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持。

零散問題

1. MySQL中的varchar和char有什麼區別.

2. varchar(10)和int(10)代表什麼含義?

3. MySQL的binlog有有幾種錄入格式?分別有什麼區別?

4. 超大分頁怎麼處理?

5. 關心過業務系統裡面的sql耗時嗎?統計過慢查詢嗎?對慢查詢都怎麼優化過?

6. 上面提到橫向分表和縱向分表,可以分別舉一個適合他們的例子嗎?

7. 什麼是存儲過程?有哪些優缺點?

8. 說一說三個範式

9. MyBatis中的#

由於篇幅原因,在這就不做全部展示了,這些題目和答案我已經整理好,花了我很久,有需要的朋友可以關注我,並轉發收藏該文章,然後私信關鍵詞【資料】即可免費領取。

通過阿里面試前,必會的MySQL精華100問,你能答對幾道


通過阿里面試前,必會的MySQL精華100問,你能答對幾道


通過阿里面試前,必會的MySQL精華100問,你能答對幾道

對於IT行業有問題或者有技術問題不懂的,可以在評論中互相交流,也可以私信我,大家一起進步!


分享到:


相關文章: