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

  • 2019 年 10 月 15 日
  • 筆記

問題背景:

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

 

處理過程:

 

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

 

1. SELECT nodename FROM view_name1 WHERE id = xxx;

2. SELECT a.id rid,accounttype,belongto,resourceId,belongtoshow FROM view_name2 a

  LEFT JOIN tablename1 b

    ON a. col1= b.col1

WHERE a.col1> 0 ;

 

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

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

 

3>通過視圖進行查詢:

 

create view t_view as

select * from t001

union all

select * from t002

 

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

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