Contents

有關程式 N+1 問題

最近在做複雜的 API
由於 PM 覺得某一個 JSON 屬性調整
結果需要改好幾隻程式 API
不過有查到可以使用GraphQL | 一种为你的 API 而生的查询语言
但這篇不是重點在 GraphQL
而是我探索某一篇 阻碍你使用 GraphQL 的十个问题 | 咀嚼之味

它就像是一顆無限向下延伸的樹。所以在我看來,GraphQL 更應該叫 TreeQL,當然在圖論裡,Tree 就是 Graph 也沒毛病啦。需要注意的是,這也會引出 「N + 1 problem」 的話題——naive 的 GraphQL 服務端實現會讓這段 query 變得異常慢!

看了一下內容,N+1 問題就有像一個查詢每一行執行 SQL
如下

1
2
3
4
5
SELECT * FROM `song` LIMIT 0, 20;
SELECT * FROM `singer` WHERE `id` = 1;
SELECT * FROM `singer` WHERE `id` = 2;
SELECT * FROM `singer` WHERE `id` = 3;
...

奇怪,這個怎麼讓我想到 ORM 也是這樣
所以我查了一下 ORM 真的也有這個問題
由於最近也想開使用 ORM ,所以進入前想了解之後使用上會遇到什麼問題
這邊只會先整理

DataLoader

目前查到資料可以用 DataLoader 方式解決問題

Dataloader 主要有兩項功能: Batching (批次) & Caching (快取) 。
Batching 在於他能夠將想要進 db 搜尋的 id 都搜集起來,等時間到了一次進 db 搜尋,解決 N + 1 問題。
Caching 在於它在紀錄 id 時會做 memoization ,所以未來若是有重複的 id 進來就會被剔除,保證資料索取數越少越好。

GraphQL Design: 使用 DataLoader 提升效能 ! - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

有爬到這篇有 10000 一筆一筆方式撈出來
得到
用範例程式實際探索 N + 1 query 有多可怕 – Yulin Chen – Medium

Laravel ORM 解決

Laravel 中解決 N + 1 問題
使用預加載功能
使用 with() 方法,會做緩存
with() 中放需要查詢的關聯屬性
總結要點:使用 Laravel 開發工具,ORM 查詢的 N + 1 問題 | Laravel China 社區 - 高品質的 Laravel 開發者社區

我自己想到的方法

由於 sharding 不能做 join 動作,所以我使用where in (id list)方式查詢
但這種方法程式一寫差錯,可能程式就500

其中有一篇 Eager Loading,Laravel 的 with 跟這個有關係

相關連結

其他小記

GraphQL 小記

sharding 小記

當下還沒有非常令人滿意的基於 hibernate 的 sharding 框架,(關於 hibernate hards 會在下文介紹),因此很多團隊會選擇自行實現 sharding。

原文網址:https://read01.com/AJO2Bm.html

Spring 的 DAO 支持

ftp 小記

因為最近沒時間整理
所以先暫時貼在這
目前可能組put xxx的 ftp 指令內容
最後在sftp < xxx.txt會比較快