開篇吐槽
說起MySQL的性能優化,相信大家在面試中都經歷過,網友這樣回答:不能使用SELECT *、不使用NULL字段、合理創建索引、為字段選擇合適的數據類型等等。這麼回答你以為就能得到面試官的芳心嗎?剛畢業的學生都會這樣回答了,但是這樣回答前兩年,可能你還會拿到offer,但是伴隨今年的寒冬時期,你就需要更加用心的去回答,比如加上一點示例,實際應用等等。
簡單回答那些技巧,面試官肯定會追問下去:是否理解其背後的工作原理?在實際場景下有用到過嗎?性能提升了嗎?可能大家都呵呵噠了。
我們有句古話:紙上得來終覺淺,須知此事要躬行。
因而理解這些優化建議背後的原理並且付諸於行動就顯得尤為重要,希望本文能讓你重新審視這些優化建議,並在實際業務場景下得到合理的運用。
性能優化
吐槽了那麼多,下面我們具體從幾個方面講下SQL的性能優化建議。
1.Scheme設計與數據類型優化
選擇數據類型只要遵循小而簡單的原則就好,越小的數據類型通常會更快,佔用更少的磁盤、內存,處理時需要的CPU週期也更少。
越簡單的數據類型在計算時需要更少的CPU週期,比如,整型就比字符操作代價低,因而會使用整型來存儲ip地址,使用DATETIME來存儲時間,而不是使用字符串。
2.創建高性能索引
索引是提高MySQL查詢性能的一個重要途徑,但過多的索引可能會導致過高的磁盤使用率以及過高的內存佔用,從而影響應用程序的整體性能。應當儘量避免事後才想起添加索引,因為事後可能需要監控大量的SQL才能定位到問題所在,而且添加索引的時間肯定是遠大於初始添加索引所需要的時間,可見索引的添加也是非常有技術含量的。
在設計索引時,如果一個索引既能夠滿足排序,又滿足查詢,是最好的。
創建索引需要注意的技巧:
- 索引創建要覆蓋查詢條件
- 使用索引掃描來排序
- 刪除長期未使用的索引
- 索引在like裡面的使用注意事項
- 對於使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引,‘aaa%’ 會使用到索引。
3.建表永遠要留一個ID主鍵
同時建表也要注意遵守以下幾個範式
4.分析查詢日誌和慢查詢日誌
記錄全部查詢。這在用 ORM 系統或者生成查詢語句的系統非常實用。
log=/var/log/mysql.log
注意千萬不要在生產環境用。否則日誌會佔滿你的磁盤空間。後果不堪設想。
記錄運行時間超過 2秒的查詢:
long_query_time=2
log-slow-queries=/var/log/mysql/log-slow-queries.log
後面還有很多很多我們不再詳說,都是很簡潔明瞭的,比如:
- 儘量不要使用NOT IN和<>操作
- 儘量避免Select * 命令
- 儘量不要使用BY RAND()命令
- 儘量少排序
- 儘量少OR
寫在文末
理解查詢是如何執行以及時間具體都消耗在哪些地方,細化到哪條SQL,再加上一些優化過程的知識,可以幫助大家更好的理解MySQL,理解常見優化技巧背後的原理。
最後衷心希望本文中的一些小技巧能夠幫助大家更好的將理論和實踐結合起來,更多的將理論知識應用到實踐中,提高自己項目的SQL性能。
發文不易,可否給個贊?謝謝各位同學~~~