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資源,影響到整體的數據庫性能,現階段已發現較多的這種使用視圖的代碼,應避免使用視圖,採用分開查詢各表的方式。