1. 一張表的數(shù)據(jù)量是百萬級的,要做分頁查詢你怎么優(yōu)化?
- 查詢字段少的話可以考慮查詢的字段都加索引,使用索引覆蓋來提升性能;
- 子查詢優(yōu)化,比如
select * from students where id in ( select id from students where age > 20 limit 100000, 10) 。
2. 連接查詢要注意什么問題嗎?
- 永遠要用小表驅(qū)動大表,比如 A 表數(shù)據(jù)量小,B 表數(shù)據(jù)量大,應(yīng)該用 A join B。
3. count(1),count(*),count(字段) 有什么區(qū)別?
- count(*) 會統(tǒng)計所有的行,包括為 null 的行,會對所有字段進行掃描;
- count(1) 也是會統(tǒng)計所有的行,包括為 null 的行,但是它只會對表中的一個字段進行掃描,可以理解為表中有個字段的值全部 1;
- count(字段名) 只會統(tǒng)計指定字段列,不包括為 null 的行。
表中只有一個字段時 count(*) 效率最高,count(列名) 當(dāng)列名是主鍵時,它的效率高于 count(1),其他情況 count(1) 效率更高。
4. 線上系統(tǒng)越跑越慢,你怎么排查?
- 開啟慢查日志,用日志分析工具分析慢 SQL,查看執(zhí)行計劃;
- 用 show profile 分析 SQL 執(zhí)行情況。
5. 什么是慢查日志?
- MySQL 會記錄執(zhí)行時間超過閾值的 SQL,默認閾值是 15s,可以在 MySQL 配置文件配置是否開啟、時間閾值以及日志文件位置;
- MySQL 自帶的工具 mysqldumpslow 可以用來分析慢查日志,比如要得到訪問次數(shù)最多的 10 個 SQL,執(zhí)行
mysqldumpslow -s c -t 10 日志文件位置 即可。
6. show profile 又是什么?
- MySQL 提供的用來分析 SQL 執(zhí)行時資源消耗情況的工具,會保存最近 15 次 SQL 運行情況,通過
show variables like 'profiling' 查看是否開啟,通過set profiling = 'on' 開啟。執(zhí)行show profiles 可以列出 SQL、執(zhí)行時間以及它的 id,執(zhí)行show profile cpu, block io for query sqlId 就可以查看該 SQL 執(zhí)行時的資源消耗情況。
7. 說一說主從復(fù)制和讀寫分離?
- 主從復(fù)制可以保證高可用,降低單個服務(wù)器的壓力,也可以用從庫做升級測試。主庫負責(zé)寫數(shù)據(jù),從庫負責(zé)讀數(shù)據(jù),主庫的 bin log 線程會把更新數(shù)據(jù)的 SQL 記錄到自己的 bin log中,IO 線程在從庫啟動后,會負責(zé)從主庫拉取 bin log,放到自己的 relay log 中,從庫的 SQL 執(zhí)行線程再執(zhí)行 relay log 中的 SQL。
- 讀寫分離依賴于主從復(fù)制,主庫寫,從庫讀,可以用代理實現(xiàn),比如 sharding-jdbc、mycat等,也可以用 MySQL 提供的 jdbc 驅(qū)動包,在配置 datasourceUrl 的時候就配置好從庫。
8. 你用過存儲過程嗎?
- 用過,一些 SQL 很多地方都要用到,就可以考慮寫成一個存儲過程。
9. 存儲過程和函數(shù)有什么異同?
- 存儲過程可以有一個或者多個返回值,必須單獨調(diào)用;函數(shù)只能有一個返回值,可以在查詢語句中直接調(diào)用。
10. 存儲過程和函數(shù)有什么優(yōu)缺點呢?
- 執(zhí)行效率高,因為它們是預(yù)編譯過的;
- 存儲過程代碼存放在數(shù)據(jù)庫,可以直接調(diào)用,減少網(wǎng)絡(luò)通訊;
- 安全性高,它們都需要一定的權(quán)限才能調(diào)用;
- 可以重復(fù)使用,減少開發(fā)人員的工作量;
11. 什么是視圖?
- 視圖是一個虛擬表,但是可以像操作真實表一樣操作它。比如你需要查詢的字段分布在兩張表,除了連接查詢,還可以建立視圖。視圖可以保護數(shù)據(jù),只提供需要的列的權(quán)限,也可以簡化 SQL,提高復(fù)用性。視圖的列可以來自同一張表,也可以來自不同的表,視圖的建立和刪除不影響基本表,對視圖內(nèi)容的修改直接影響基本表,視圖來自多個基本表時,不允許添加和刪除數(shù)據(jù)。對視圖的操作包括增刪改查,視圖的建立方法是
create view <視圖名> as <select語句> ,查看用describle <視圖名>,修改視圖用 alter <視圖名>,刪除視圖用drop <視圖名> 。
12. 什么是觸發(fā)器?
- 特殊的存儲過程,觸發(fā)了特定條件會自動執(zhí)行,總共有六種觸發(fā)器,before insert,after insert,before update,after update,before delete,after delete。
|