2017-04-27 99 views
2

我有一個Node.js REST API,通過node-mysql直接與MySQL數據庫一起工作。如何在REST API端點上處理結果篩選?

我正在尋找一種方法來以最具性能的方式過濾端點上的數據庫結果。

目前,我有一個端點/api/v2/matches,其中我的API代碼查詢數據庫並將結果輸出爲JSON響應。

我打算在此端點上使用過濾器。例如/api/v2/matches?filter[team]=TeamId

在我的代碼中過濾這些數據庫結果的最佳方式/最具性能的方式是什麼?

我應該:

  • 查詢的一切數據庫,並使用Array.prototype.filter()或類似我的結果陣列將數據正確地過濾。

  • 以編程方式組裝我的查詢字符串,具體取決於在對象req.query.filters上傳遞的內容並查詢數據庫。

請記住,我目前對這個端點的查詢(返回所有結果的那個)有幾個INNER JOINS正在進行。我在這個查詢中也使用了LIMIT 50

回答

1

磁盤訪問時間和數據傳輸是這裏的主要瓶頸。但是,LIMIT 50對此有一個有趣的含義。您應該在數據庫查詢中使用過濾器,因爲它會限制數據庫搜索的時間量,並且如果您的數據庫是遠程數據庫,它也會限制傳輸的數據量(如果您的數據庫不是遠程的,收益會更小但還在那兒)。與此相比,構建查詢所產生的輕微開銷可以忽略不計。

SELECT *查詢確實是爲速度而設計的,但您的DBMS將不得不覆蓋整個數據集。使用SELECT WHERE可以獲得更好的執行時間,尤其是如果您在數據庫模式中提供了適當的索引,因爲即使使用JOIN,也只限於50個結果。

此外,請記住,SELECT WHERE查詢有多年的研究背後的研究和技巧來加速它們,而Array.prototype.filter可能是一個非常簡單的實現「if(lambda(x))arr。 append(x)「或類似的東西。幾乎所有的公司都在使用它而不是filter