將所需數據先從資料庫中讀出,再在內存中組裝(拆成多個小查詢,使用多線程查詢,CountDownLatch組裝)會比寫複雜SQL(包含大量join和子查詢)一把查詢出來快嗎?


你想想看,首先應用層計算的演算法優化一般不如資料庫內部幾十年的優化能力強;其次多線程去拉數據在應用層計算,資料庫內部也有多線程,而且有更好更極致的多線程調度同步協調等能力;再次即使上述兩者一樣,你在資料庫側算完再到應用層比你所有數據都到應用層,肯定少了很多數據傳輸量,網路消化小很多(數據包啊,協議啊,序列化和反序列化等開銷),在資料庫內部做還有可能部分數據查詢被優化掉,計算量更少。

因此,如果資料庫壓力不大的話,同樣資源量下理論上大部分時候還是資料庫更快。當然不排除那些不夠成熟和完整,或者場景完全不合適的資料庫在特殊場景性能不夠好。


如果能預先知道查詢類型和準確的數據分布確定最優的訪問路徑和方式做預計算,那還是可能更快的。對一個通用場景的話,不看好。

從題干括弧里那些優化來看,不能。跟資料庫已經實現的優化相比基本拿不出手。題主好像有點小看資料庫行業無論學術界還是工業界幾十年的積累了。


我覺得並不會,因為資料庫中的複雜 SQL,表關聯什麼的,其實很多也是在內存中執行,而搞資料庫的那群大神已經把這些優化做到了極致。

但是在遇到複雜 SQL 時,還是建議拆成多個查詢,在內存中處理數據。為什麼呢,因為大部分的項目,資料庫一般只會部署一個實例,部署集群會比較麻煩,而應用部署集群就相對容易的多,所以一般是多個應用集群對應一個資料庫實例。這樣的話,拆分複雜 SQL,減少資料庫的壓力,把數據處理的壓力放在應用中,會比較好。


絕大部分情況下不會


首先得理解什麼是複雜SQL,嵌套查詢、多表關聯這些SQL複雜但不代表性能一定低下。

只要執行計劃合理,資料庫可以將數據快速取出並返回結果。

如果比較基於內存的數據處理計算,兩者差異應該不大。


推薦閱讀:
相关文章