iT邦幫忙

0

NODE.JS資料庫連線池撈資料與資料庫內預存程序撈資料-效能差異

  • 分享至 

  • xImage

問題

想請問一下,
如果用NODE.JS,使用連接資料庫連線池撈資料,以下哪個效能較佳?

1.NODE.JS 呼叫MYSQL 30次 (30次SELECT)
2.NODE.JS 呼叫MYSQL 預存程序:甲 1次 ,甲再去呼叫預存程序乙30次,
甲蒐集完資料後,再統一回傳給NODE.JS


補充說明

我的想法是2應該比較省效能,因為作法1等於要跟資料庫重新連線30次,
作法2則是只要連線1次。

但我看網路上有說法是

說法一:
MYSQL每呼叫一次預存程序,等於是開一個查詢視窗,也就是一個新的DB CONNECTION,所以呼叫30次預存程序,等於連線DB30次

說法二:
NODE.JS的資料庫連線池已經預存好資料庫連線了,等於一直保持連接,呼叫幾次無所謂

看更多先前的討論...收起先前的討論...
發錯,沒事.
Cinna iT邦新手 4 級 ‧ 2020-10-05 12:02:41 檢舉
預存程序的參數需要輸入單日日期,輸入以後會在裡面做滿多條件判斷跟JOIN十幾張表後SUM一些數值,我還沒想到改寫的方法XD
想說先用迴圈解決,我知道迴圈跑一定很慢,
但希望慢中取快(?),才想知道迴圈要做在node還是DB會比較快~
Cinna iT邦新手 4 級 ‧ 2020-10-05 12:03:47 檢舉
XDDD 沒有發錯啦 覺得這個問題也滿好的
的確改寫會比跑迴圈快,謝謝你的意見
像這樣的情境, 用 Materialized View 會是比較好的,
方法二「呼叫 MYSQL 預存程序」會比較快,不過應該相差不大
如果是猶豫迴圈要寫在程式還是 SQL 的話,我會選擇程式,效能差異不大的情況下,我比較喜歡用程式處理
Cinna iT邦新手 4 級 ‧ 2020-10-06 09:52:44 檢舉
程式好像比較方便DEBUG,兩邊各有好壞,要想一下寫在哪捏,感謝提出意見!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-10-05 15:49:58
最佳解答

一般比較效能的對照組如下:
1.SQL statement vs Stored Procedure - Store Procedure 快
2.未使用 Connection Pool vs 使用 Connection Pool - 使用 Connection Pool 快

綜合以上兩點原則
答案是第2種方式效能比較好

原因是「Stored Procedure」
而非兩種方式都有使用的「Connection Pool」

另外,點這裡是我這次鐵人賽唯一的一篇文章,喜歡的話左上角點 Like

看更多先前的回應...收起先前的回應...
Cinna iT邦新手 4 級 ‧ 2020-10-05 15:55:24 檢舉

你好,感謝回答,
那想再請問:
假設預存程序的內容是concat出select字串,再執行。
這樣其實也是Store Procedure組成SQL statement 。
也就是
1.select statement
2.call SP =>concat出select statement=>執行select statement

這樣依然是2比較快嗎?

Stored Procedure 是快在「PreCompiled SQL Statement」
其中 SQL Statement 是固定的,只有參數是變動的
如果用寫程式串 SQL 的方式來使用 Stored Procedure
那其實沒什麼好研究的

如果你真的想知道答案
就自己灌個幾百萬筆資料來比較看看就知道了

看到這個 SP 去 concat 出select statement.
這段組合的速度,MySQL 解析的不會很快.
這種事情,你們開心就好了,就測試看看.
本質上沒變,還是那招組合.

看到這個 SP 去 concat 出select statement

/images/emoticon/emoticon02.gif

Cinna iT邦新手 4 級 ‧ 2020-10-06 09:51:13 檢舉

好的,感謝兩位,我再研究看看~謝謝

我要發表回答

立即登入回答