mysql优化面试整理-吊打面试官
1. MySQL有哪些存儲引擎,各有什么特點
- InnoDB
MySQL5.5以后的默認引擎,支持行鎖、事務和外鍵,并發寫性能高,適合讀寫較多的業務場景。 - MyISAM
MySQL5.5之前的默認引擎,不支持行鎖、事務和外鍵,支持表鎖,并發寫性能較低,訪問速度較快。適合以讀和插入為主的業務場景。不適合修改和刪除較多的業務場景。 - Memory
數據存放在內存中,容易丟失數據。基本上用不到該引擎,可以用Redis等緩存中間件替代。
2. MySQL的索引結構
B+Tree
特點:所有的數據都存在葉子節點,并且相鄰的葉子節點都有指針鏈接。
3. 索引分類
- 聚集索引
一般是主鍵,索引和數據存儲在一起,葉子節點保存行數據。
如果表沒有主鍵,MySQL會以第一個唯一索引作為聚集索引。
如果表也沒有唯一索引,MySQL會自動創建一個rowId作為隱藏的聚集索引。 - 非聚集索引
我們手動創建的索引一般都是非聚集索引,索引和數據分開存儲,葉子節點保存行對應的主鍵。
延申問題:加入一個表有主鍵Id,字段a、字段b、字段c組成,其中A和B建立了聯合索引,那么select Id,a,b,c where a=‘1’,是否可以進行優化?
答:可以的,目前的方案由于a和b建立了索引,那么查詢a的時候也能在索引中查詢到b,而索引的葉子節點存儲的是主鍵,那么Id也可以一次性查出來。而c字段沒有索引,葉子節點也不會存儲c字段,那么就需要根據葉子節點關聯到的主鍵通過聚集索引去查詢行數據,造成了回表查詢。
優化方案就是:a、b、c一起建立聯合索引,就可以一次查出id,a,b,c四個字段了,避免了回表查詢。
4. 索引的設計原則
5. 索引使用原則
最左前綴法則
指的是查詢從索引的最左前列開始,并且不跳過中間的列。
避免索引失效
索引失效的幾種情況:
- 模糊查詢%在前面
- 在索引列上進行計算操作,比如截取字符串
- 范圍查詢大于或小于,大于或小于右邊的列索引會失效(可用大于等于或小于等于代替)
- or鏈接的查詢,or前后字段都要有索引,否則索引會失效
- 字符串字段要使用引號,否則索引失效
- 數據分布范圍較小,索引可能失效(比如性別字段建立索引,90條是男10條是女,這時候可能不會用到索引)
覆蓋索引
盡量使用覆蓋索引, 覆蓋索引就是只查詢建立索引的字段,減少使用select * (逐漸查詢除外),避免回表查詢。
前綴索引
當字段類型為varchar、text等時,有時候需要索引很長的字符串,這會讓索引變得很大,查詢時,浪費大量的磁盤O,影響查詢效率。此時可以只將字符串的一部分前綴,建立索引,這樣可以大大節約索引空間,從而提高索引效率。
復合索引
盡量使用復合索引,少使用單列索引。如果a,b,c都只創建了單列索引,那么mysql只會選擇最優的一個索引使用,而不會把三個字段的索引都用上。如果a,b,c創建了聯合索引,那么他們三個字段都會用到索引去查詢。
6. SQL性能分析
1. 慢查詢日志
配置文件中開啟慢查詢日志,沒有性能問題的話,可以不用開啟,因為記錄慢查詢日志也是會耗費時間的。
2. profile關鍵字
通過該關鍵字可以分析出,慢查詢具體慢到哪里了。可能的原因有查詢結果太大,內存不夠用,需要借助磁盤空間、產生了臨時表、復制內存中的臨時表到磁盤、出現了鎖等。
3.explain關鍵字
通過該關鍵字可以分析sql執行的計劃,在查詢語句前加上該關鍵字即可。一些重要指標供參考分析,比如type字段可以看出sql的執行效率、possible_key列出可能會用到的索引、key列出實際用到的索引、rows掃描行數、filtered返回行數與讀取行數的百分比等。
總結
以上是生活随笔為你收集整理的mysql优化面试整理-吊打面试官的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RIP --- 路由信息协议
- 下一篇: 项目2-Time类中的运算符重载