面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

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

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

主要針對的是開發人員需要知道的一些MySQL的知識點,主要包括索引,事務,優化等方面,以在面試中高頻的問句形式給出答案

索引相關

  • 什麼是索引?
  • 索引是個什麼樣的數據結構呢?
  • Hash索引和B+樹所有有什麼區別或者說優劣呢?
  • 上面提到了B+樹在滿足聚簇索引和覆蓋索引的時候不需要回表查詢數據,什麼是聚簇索引?
  • 非聚簇索引一定會回表查詢嗎?
  • 在建立索引的時候,都有哪些需要考慮的因素呢?
  • 聯合索引是什麼?爲什麼需要注意聯合索引中的順序?
  • 創建的索引有沒有被使用到?或者說怎麼纔可以知道這條語句運行很慢的原因?
  • 那麼在哪些情況下會發生針對該列創建了索引但是在查詢的時候並沒有使用呢?

事務相關

  • 什麼是事務?
  • ACID是什麼?可以詳細說一下嗎?
  • 同時有多個事務在進行會怎麼樣呢?
  • 怎麼解決這些問題呢?MySQL的事務隔離級別瞭解嗎?
  • Innodb使用的是哪種隔離級別呢?
  • 對MySQL的鎖瞭解嗎?
  • MySQL都有哪些鎖呢?像上面那樣子進行鎖定豈不是有點阻礙併發效率了?

表結構設計

  • 爲什麼要儘量設定一個主鍵?
  • 主鍵使用自增ID還是UUID?
  • 字段爲什麼要求定義爲not null?
  • 如果要存儲用戶的密碼散列,應該使用什麼字段進行存儲?

**存儲引擎相關

  • MySQL支持哪些存儲引擎?
  • MySQL中的varchar和char有什麼區別.
  • varchar(10)和int(10)代表什麼含義?
  • MySQL的binlog有有幾種錄入格式?分別有什麼區別?
  • 超大分頁怎麼處理?
  • 關心過業務系統裏面的sql耗時嗎?統計過慢查詢嗎?對慢查詢都怎麼優化過?
  • 上面提到橫向分表和縱向分表,可以分別舉一個適合他們的例子嗎?
  • 什麼是存儲過程?有哪些優缺點?
  • 說一說三個範式
  • MyBatis中的#
    面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

20道常見MySQL數據庫面試題+解析

  1. 事務的併發?事務隔離級別,每個級別會引發什麼問題,MySQL默認是哪個級別?
  2. 事務四大特性(ACID)原子性、一致性、隔離性、持久性?
  3. MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?
  4. MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?
  5. 查詢語句不同元素(where、jion、limit、group by、having等等)執行先後順序?
  6. 什麼是臨時表,臨時表什麼時候刪除?
  7. MySQL B+Tree索引和Hash索引的區別?
  8. sql查詢語句確定創建哪種類型的索引?如何優化查詢?
  9. 聚集索引和非聚集索引區別?
  10. 有哪些鎖(樂觀鎖悲觀鎖),select 時怎麼加排它鎖?
  11. 非關係型數據庫和關係型數據庫區別,優勢比較?
  12. 數據庫三範式,根據某個場景設計數據表?
  13. 數據庫的讀寫分離、主從複製,主從複製分析的 7 個問題?
  14. 使用explain優化sql和索引?
  15. MySQL慢查詢怎麼解決?
  16. 什麼是 內連接、外連接、交叉連接、笛卡爾積等?
  17. mysql都有什麼鎖,死鎖判定原理和具體場景,死鎖怎麼解決?
  18. varchar和char的使用場景?
  19. mysql 高併發環境解決方案?
  20. 數據庫崩潰時事務的恢復機制(REDO日誌和UNDO日誌)?

1.事務的併發?事務隔離級別,每個級別會引發什麼問題,MySQL默認是哪個級別?

從理論上來說, 事務應該彼此完全隔離, 以避免併發事務所導致的問題,然而, 那樣會對性能產生極大的影響, 因爲事務必須按順序運行, 在實際開發中, 爲了提升性能, 事務會以較低的隔離級別運行, 事務的隔離級別可以通過隔離事務屬性指定。

2.1事務的併發問題

(1)髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據

(2)不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。

(3)幻讀:幻讀解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。

例如:事務T1對一個表中所有的行的某個數據項做了從“1”修改爲“2”的操作 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是爲“1”並且提交給數據庫。 而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有跟沒有修改一樣,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

2.2事務的隔離級別

事務隔離級別
面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

  • 讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的SELECT會讀到這些未被提交的數據髒讀 不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。 可重複讀:在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象* 串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。併發的事務,就像事務是在一個個按照順序執行一樣

2.事務四大特性(ACID)原子性、一致性、隔離性、持久性?

原子性(Atomicity)

  • 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

一致性(Consistency)

  • 事務開始前和結束後,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

隔離性(Isolation)

  • 隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到。   持久性(Durability)

  • 持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

MySQL默認的事務隔離級別爲repeatable-read

  • MySQL 支持 4 中事務隔離級別.
  • 事務的隔離級別要得到底層數據庫引擎的支持, 而不是應用程序或者框架的支持.
  • Oracle 支持的 2 種事務隔離級別:READ_COMMITED , SERIALIZABLE

補充

1.SQL規範所規定的標準,不同的數據庫具體的實現可能會有些差異
2.MySQL中默認事務隔離級別是“可重複讀”時並不會鎖住讀取到的行

  • 事務隔離級別:未提交讀時,寫數據只會鎖住相應的行。
  • 事務隔離級別爲:可重複讀時,寫數據會鎖住整張表。
  • 事務隔離級別爲:串行化時,讀寫數據都會鎖住整張表。

隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設爲Read Committed,它能夠避免髒讀取,而且具有較好的併發性能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。
面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

21條MySQL性能調優經驗

  1. 爲查詢緩存優化你的查詢
  2. EXPLAIN 你的 SELECT 查詢
  3. 當只要一行數據時使用 LIMIT 1
  4. 爲搜索字段建索引
  5. 在Join表的時候使用相當類型的例,並將其索引
  6. 千萬不要 ORDER BY RAND()
  7. 避免 SELECT *
  8. 永遠爲每張表設置一個ID
  9. 使用 ENUM 而不是 VARCHAR
  10. 從 PROCEDURE ANALYSE() 取得建議
  11. 儘可能的使用 NOT NULL
  12. Prepared Statements
  13. 無緩衝的查詢
  14. 把IP地址存成 UNSIGNED INT
  15. 固定長度的表會更快
  16. 垂直分割
  17. 拆分大的 DELETE 或 INSERT 語句
  18. 越小的列會越快
  19. 選擇正確的存儲引擎
  20. 使用一個對象關係映射器(Object Relational Mapper)
  21. 小心“永久鏈接”
    面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

共同進步,共勉

由於篇幅有限,這裏就不一一羅列了,100道常見面試題(含答案)+21條MySQL性能調優經驗小編已整理成Word文檔或PDF文檔,需要完整版的朋友可以加下vx:xx2603126560 即可免費獲取

還有更多複習資料分享如下,需要完整版的朋友可以加下vx:xx2603126560 即可免費獲取

面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

面試被問MySQL總回答不好:總結100道MySQL面試題和21題MySQL性能優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章