MySQL性能優化之簡單sql改寫

1> html

問題描述數據庫

某客戶集團反饋某模塊崩潰,致使系統異常,系統沒法登錄;app

關閉該模塊瀏覽模塊後,系統才恢復正常問題重複出現屢次。ide


處理過程性能

協助排查問題優化過程當中發現查詢該模塊的一個長SQL致使性能問題,其中引起問題的主要緣由在下圖中的部分SQL片斷:優化

 

以上SQL中workflowtye在流程表中存放的爲int類型,而子句中的content確爲char類型,兩個類型不一樣的字段進行關聯比較時,致使索引失效。spa

修改conten的字段類型爲int以後SQL性能恢復正常。設計

在表設計初期,應將須要進行關聯的字段類型設置爲同一類型。不然會帶來嚴重的性能問題,後期修改的難度將更大。3d


2> 日誌

問題描述

配合客戶上線壓測期間,發現某接口查詢SQL在數據量比較大時性能沒法知足客戶要求,需進行改造優化


處理過程

該SQL的查詢邏輯耗時主要在排序分頁上,SQL精簡以後的邏輯以下:

 

 

優化的思路以下:

相似這種分頁+排序的SQL,第一種書寫的邏輯,在使用createdate和createtime進行排序時,須要經過主鍵回表查詢帶出其餘附帶的字段信息,

雖然能夠利用到索引,可是這種邏輯並不是最高效的,尤爲再分頁越靠後的時候,隨着偏移量加大,須要拿到內存中的數據就更多,查詢耗時就更久。

而第二種SQL的書寫方法,requestid和createdate,createtime字段上均有索引,在進行排序和分頁時,只須要檢索索引便可完成(MySQL的覆蓋索引概念),

只獲取到分頁以後的requestid值再與外部表進行inner join,查詢速度會極大的提高,而且查詢效率不會由於分頁靠後而明顯降低。

http://m.qd8.com.cn/yiyao/xinxi21_3709995.html

3> 

問題描述

客戶環境數據庫CPU出現告警信息,協助進行排查數據庫相關問題。


處理過程

經過慢日誌分析對數據庫的總體性能分析並進行了優化。

此處列舉咱們程序中經常使用的一個問題邏輯:

部分SQL片斷以下

 

 焦做國醫胃腸醫院口碑怎麼樣:http://jz.lieju.com/zhuankeyiyuan/37324643.htm

代碼中較多的SQL發現開發人員習慣使用exists邏輯來過濾數據,可是在MySQL中,exists的性能並非最高的,即便在字段存在索引的狀況下,在結結果集比較大狀況下,

exists的檢索速度遠不如inner join的hash鏈接,並且過多的使用exists容易致使SQL的執行計劃異常,而inner join邏輯相對更加直接,簡化。

咱們推薦的優先邏輯:join  >  exists  >  in

相關文章
相關標籤/搜索