吊打面試官!MySQL靈魂100問,你能答出多少?

網際網路搬運工發表於2019-09-10

推薦閱讀:

  1. 面試機會不等人,資料看精不看多!史上最全Java技術資料合集!
  2. 2019年中總結,400道一線大廠高頻精選面試題合集(JVM+Spring+RabbitMQ+Mybatis+Redis+分散式+微服務)
  3. 整理完今年的阿里、騰訊、網易等公司的面試後,我有一個重大的發現

前言

本文主要受眾為開發人員,所以不涉及到MySQL的服務部署等操作,且內容較多,大家準備好耐心和瓜子礦泉水.

前一陣系統的學習了一下MySQL,也有一些實際操作經驗,偶然看到一篇和MySQL相關的面試文章,發現其中的一些問題自己也回答不好,雖然知識點大部分都知道,但是無法將知識串聯起來.

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

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

索引相關

關於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. 那麼在哪些情況下會發生針對該列建立了索引但是在查詢的時候並沒有使用呢?

事務相關

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來儲存,這樣可以節省空間且提高檢索效率.

儲存引擎相關

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中的#

由於篇幅原因,在這就不做全部展示了,這些題我已經整理成pdf文件免費分享給那些有需要的朋友,同時整理也花費了蠻多時間,有需要的朋友可以點選免費 領取

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946007/viewspace-2656580/,如需轉載,請註明出處,否則將追究法律責任。

相關文章