MySQL 視圖(合並多表數據)引發的嚴重性能問題


問題背景:

一、客戶環境連續多次出現性能問題,系統登入異常,數據庫CPU告警。

 

處理過程:

 

1>協助排查數據庫性能問題時發現如下兩個較頻繁的SQL導致嚴重的性能問題(均使用了視圖合並多表數據):

復制代碼
1 1. SELECT nodename FROM view_name1 WHERE id = xxx;
2 
3 2. SELECT a.id rid,accounttype,belongto,resourceId,belongtoshow FROM view_name2 a
4   LEFT JOIN tablename1 b
5     ON a. col1= b.col1
6 WHERE a.col1> 0 ;
復制代碼

 

2> 上面兩個SQL使用到了視圖(視圖通過union all合並了兩張表的數據)。下面以t001和t002為例分別給出直接查詢原表和使用視圖查詢的執行計划對比

(其中t001和t002表中id列均有索引):直接查詢原表后對結果進行合並:

 

3>通過視圖進行查詢:

 

1 create view t_view as
2 select * from t001
3 union all
4 select * from t002

 

 

4> 對比執行計划可以發現,使用視圖進行數據union all會導致索引失效,使用了全表掃描的方式進行數據檢索,在並發高的情況下,

占用較多的磁盤IO,嚴重消耗數據庫的CPU和IO資源,影響到整體的數據庫性能,現階段已發現較多的這種使用視圖的代碼,應避免使用視圖,采用分開查詢各表的方式。

 

 

————————————————

 

聚焦技術與人文,分享干貨,共同成長更多內容請關注“數據與人”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM