java面試題 --- MySQL③

1. 生產環境中一條 SQL 執行特別慢,你要如何排查問題?

  • 可以查看 SQL 的執行計劃。

2. 執行計劃怎麼用?

  • explain 後面加上要執行的 SQL。

3. 執行計劃包含了哪些信息?

  • id:執行計劃的 id,可以看出各表的執行順序;
  • select type:查詢類型,simple 是簡單查詢,subquery 是子查詢,primary 是子查詢的外層,union 是連接查詢,derived 是臨時表;
  • type:訪問類型,效率最好的是 system,表中只有一條記錄;const次之,通過索引一次就找到了;eq_ref,唯一索引掃描,效率也很高;ref,非唯一索引掃描;range,用索引在範圍內查找;index,全索引樹掃描;all,性能最差,全表掃描;
  • possible key:可能用到的索引;
  • key:用到的索引;
  • extra:重要且不適合在其他列顯示的信息,比如 using filesort 表示出現了文件內排序,性能十分差;using temporary 表示使用了臨時表,性能也不好;using index 表示用了索引,性能還可以;impossible where,表示 where 後面的條件總是 false。

4. 一張表有千萬級的數據,你怎麼優化?

  • 建立適當的索引;
  • 使用緩存;
  • 做讀寫分離;
  • 垂直拆分,將字段多的表拆分成多張表;
  • 水平拆分,比如 id 爲 1 到 50w 的放到第一張表,50w 到 100w 的放到第二張表。

5. 聚簇索引和非聚簇索引在查詢數據時有什麼區別?

  • 聚簇索引更快,因爲葉子節點存放的是數據行,不需要回表查詢。

6. 非聚簇索引一定要回表查詢嗎?

  • 不一定,正常情況是查到拿到葉子節點存儲的主鍵的值,然後再根據主鍵值去做回表查詢,但如果是索引覆蓋的情況,就不需要回表查詢了。

7. 什麼叫索引覆蓋?

  • 索引覆蓋就是查詢的字段都建了索引,數據可以直接從索引中獲取,不需要查詢數據表。

8. 使用索引有哪些優缺點?

  • 優點:提高檢索效率,提高排序的效率;
  • 缺點:降低了寫數據的效率,因爲寫數據的同時還要維護索引;索引也佔用額外的空間。

9. 如果要對用戶密碼字段建索引,你打算建什麼索引?

  • 密碼字段可以用前綴索引,比如用密碼字段的前 10 位做索引,因爲前 10 位的標識度也夠高了。前綴索引可以節省空間。

10. 創建聯合索引的時候怎麼確定哪個字段放前面?

  • 識別度最高的字段放到最前面,這樣可以提高效率。

11. MySQL 5.6 開始對索引做了什麼優化,瞭解嗎?

  • 做了索引下推的優化,索引下推可以減少回表查詢的次數。比如建立了聯合索引 index(name, age),然後查詢 select * from user where name like '張%' and age = 20,沒有索引下推的話,MySQL 會把name like '張%'的數據都返回到 MySQL 服務端,服務端再去判斷這些數據的 age 是否爲 20;而有了索引下推的話,查詢的時候會先判斷 name like '張%' 的這些數據 age 是否爲 20,不是的直接忽略。

12. 你認爲哪些情況適合建索引?哪些情況不適合建索引?

  • 頻繁作爲查詢條件的字段、排序字段、統計和分組的字段以及與其他表關聯的字段應該建立索引;
  • 頻繁更新的字段以及字段值大量重複的不適合建立索引。

13. 使用索引的時候你會遵循哪些原則?

  • 全值匹配是最理想的狀態,即查詢條件字段都建立了索引且順序和索引順序一致;
  • 遵循最左前綴法則,比如索引順序是 A、B、C,那麼查詢條件一定要有 A,否則 B 和 C 都會失效;中間索引頁不能斷,如果查詢條件是 A 和 C,少了 B,那麼 C 也會失效;
  • 索引列上不要做任何計算,計算將導致索引失效;
  • 範圍之後的列索引會失效,比如 name like '張% and age = 20',那麼 age 這個索引將失效;
  • 寫模糊查詢時百分號要寫右邊,否則索引失效;
  • 不要寫 select *,用到什麼列就查什麼列,這樣可以增加索引覆蓋的機率;
  • 不等於、is null、is not null、or 這些都會導致索引失效;
  • 字符串的引號不能漏寫,否則索引會失效。

輔助記憶,詩曰:
全值匹配我最愛, 最左前綴要遵守;
帶頭大哥不能死, 中間兄弟不能斷;
索引列上少計算, 範圍之後全失效;
模糊百分寫最右, 覆蓋索引不寫星;
不等空值還有或, 索引失效要少用;
字符引號不可丟, 牢記以上就無憂。

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