慢SQL與一條耗時很長的SQL


一、最近有一個任務,需要數據庫對幾張表結果進行計算,生成報表。已知條件為:

數據庫中已有的三張表A、B、C進行拼接操作,三張表的數據量分別為A:幾萬,B:幾十萬,C:幾萬。

對B表所有數據,通過關聯的ID等字段,補全存儲在A\C 中的信息,(B的數據也可能在A\C中不存在關聯)並將結果寫入到D表

 

舊的方案有兩種:

1、首先批量讀取表B的數據,然后逐條處理B的記錄:查詢關聯的A\C 表數據,進行計算,最后將計算的結果寫入到表D。)

2、利用一條SQL語句insert select jion,將計算過程交給數據庫進行計算並且批量插入到表D。

 

方案一的實踐結果很慢,整個計算完耗時4個小時。系統需要不斷的讀取數據庫,寫入數據庫,IO耗時太高。而且需要控制好每次讀取B表的數據條數,太大容易產生OOM,IO耗時更多了

方案二的時間結果將計算壓力轉移到了數據庫,並且減少了數據庫的連接次數,一條SQL搞定。耗時50分鍾。這樣Java線程一直在等待SQL執行結果,很容易超時。對於使用了TDDL中間件后,隨着數據量的增大,需要不斷的調整等待時間上限,不是一個合理的選擇。

 

二、慢SQL問題回顧

慢SQl查詢時間:
1、查詢cnlearn_grop_detail表,時間超過1s的sql語句,都會被記錄為慢sql
2、整個查詢時間包括排隊等待時間,所以當訪問量不大的時候,可能看不到問題,因為不需要排隊等待
3、集團給每台機器配置的數據庫連接池的鏈接數是5-10個鏈接​​,兩台機器也就是20個連接為上線。因此如果並發數量超過這個數目,就會需要排隊
4、發生問題時,當時的並發查詢數量為100-200,所以導致慢SQL爆發​
5、在優化索引之前,每條查詢語句在700ms左右,算上等待時間,就出問題了。


免責聲明!

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



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