java面試題 --- MySQL④

1. 一張表的數據量是百萬級的,要做分頁查詢你怎麼優化?

  • 查詢字段少的話可以考慮查詢的字段都加索引,使用索引覆蓋來提升性能;
  • 子查詢優化,比如 select * from students where id in ( select id from students where age > 20 limit 100000, 10)

2. 連接查詢要注意什麼問題嗎?

  • 左連接索引加在右表,右連接索引加在左表;
  • 永遠要用小表驅動大表,比如 A 表數據量小,B 表數據量大,應該用 A join B。

3. count(1),count(*),count(字段) 有什麼區別?

  • count(*) 會統計所有的行,包括爲 null 的行,會對所有字段進行掃描;
  • count(1) 也是會統計所有的行,包括爲 null 的行,但是它只會對錶中的一個字段進行掃描,可以理解爲表中有個字段的值全部 1;
  • count(字段名) 只會統計指定字段列,不包括爲 null 的行。

表中只有一個字段時 count(*) 效率最高,count(列名) 當列名是主鍵時,它的效率高於 count(1),其他情況 count(1) 效率更高。


4. 線上系統越跑越慢,你怎麼排查?

  • 開啓慢查日誌,用日誌分析工具分析慢 SQL,查看執行計劃;
  • 用 show profile 分析 SQL 執行情況。

5. 什麼是慢查日誌?

  • MySQL 會記錄執行時間超過閾值的 SQL,默認閾值是 15s,可以在 MySQL 配置文件配置是否開啓、時間閾值以及日誌文件位置;
  • MySQL 自帶的工具 mysqldumpslow 可以用來分析慢查日誌,比如要得到訪問次數最多的 10 個 SQL,執行 mysqldumpslow -s c -t 10 日誌文件位置 即可。

6. show profile 又是什麼?

  • MySQL 提供的用來分析 SQL 執行時資源消耗情況的工具,會保存最近 15 次 SQL 運行情況,通過show variables like 'profiling'查看是否開啓,通過set profiling = 'on'開啓。執行show profiles可以列出 SQL、執行時間以及它的 id,執行show profile cpu, block io for query sqlId就可以查看該 SQL 執行時的資源消耗情況。

7. 說一說主從複製和讀寫分離?

  • 主從複製可以保證高可用,降低單個服務器的壓力,也可以用從庫做升級測試。主庫負責寫數據,從庫負責讀數據,主庫的 bin log 線程會把更新數據的 SQL 記錄到自己的 bin log中,IO 線程在從庫啓動後,會負責從主庫拉取 bin log,放到自己的 relay log 中,從庫的 SQL 執行線程再執行 relay log 中的 SQL。
  • 讀寫分離依賴於主從複製,主庫寫,從庫讀,可以用代理實現,比如 sharding-jdbc、mycat等,也可以用 MySQL 提供的 jdbc 驅動包,在配置 datasourceUrl 的時候就配置好從庫。

8. 你用過存儲過程嗎?

  • 用過,一些 SQL 很多地方都要用到,就可以考慮寫成一個存儲過程。

9. 存儲過程和函數有什麼異同?

  • 存儲過程可以有一個或者多個返回值,必須單獨調用;函數只能有一個返回值,可以在查詢語句中直接調用。

10. 存儲過程和函數有什麼優缺點呢?

  • 執行效率高,因爲它們是預編譯過的;
  • 存儲過程代碼存放在數據庫,可以直接調用,減少網絡通訊;
  • 安全性高,它們都需要一定的權限才能調用;
  • 可以重複使用,減少開發人員的工作量;
  • 可移植性差,維護也比較麻煩。

11. 什麼是視圖?

  • 視圖是一個虛擬表,但是可以像操作真實表一樣操作它。比如你需要查詢的字段分佈在兩張表,除了連接查詢,還可以建立視圖。視圖可以保護數據,只提供需要的列的權限,也可以簡化 SQL,提高複用性。視圖的列可以來自同一張表,也可以來自不同的表,視圖的建立和刪除不影響基本表,對視圖內容的修改直接影響基本表,視圖來自多個基本表時,不允許添加和刪除數據。對視圖的操作包括增刪改查,視圖的建立方法是create view <視圖名> as <select語句>,查看用describle <視圖名>,修改視圖用alter <視圖名>,刪除視圖用drop <視圖名>

12. 什麼是觸發器?

  • 特殊的存儲過程,觸發了特定條件會自動執行,總共有六種觸發器,before insert,after insert,before update,after update,before delete,after delete。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章