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

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

所以決定搞一個MySQL靈魂100問,試着用回答問題的方式,讓本身對知識點的理解更加深刻一點面試

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

索引相關數據庫

  • 什麼是索引?
  • 索引是個什麼樣的數據結構呢?
  • 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默認是哪一個級別?app

從理論上來講, 事務應該彼此徹底隔離, 以免併發事務所致使的問題,然而, 那樣會對性能產生極大的影響, 由於事務必須按順序運行, 在實際開發中, 爲了提高性能, 事務會以較低的隔離級別運行, 事務的隔離級別能夠經過隔離事務屬性指定。框架

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性能優化

相關文章
相關標籤/搜索