有關程式 N+1 問題
最近在做複雜的 API
由於 PM 覺得某一個 JSON 屬性調整
結果需要改好幾隻程式 API
不過有查到可以使用GraphQL | 一种为你的 API 而生的查询语言
但這篇不是重點在 GraphQL
而是我探索某一篇 阻碍你使用 GraphQL 的十个问题 | 咀嚼之味
它就像是一顆無限向下延伸的樹。所以在我看來,GraphQL 更應該叫 TreeQL,當然在圖論裡,Tree 就是 Graph 也沒毛病啦。需要注意的是,這也會引出 「N + 1 problem」 的話題——naive 的 GraphQL 服務端實現會讓這段 query 變得異常慢!
看了一下內容,N+1 問題就有像一個查詢每一行執行 SQL
如下
|
|
奇怪,這個怎麼讓我想到 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
跟這個有關係
- ORM 中的 N+1 问题 - google4y - 博客园
- ◉ Performance: N+1 Query Problem
- GraphQL N+1 问题解决方案 | HHF 金字塔
- [Rails] N+1 Queries Problem – Dosmanthus – Medium
- Eloquent: Relationships - Laravel - The PHP Framework For Web Artisans
- 数据库:django ORM 如何处理 N+1 查询 - 答复哈 - OSCHINA
- Laravel N+1 Problem @ Neil的部落格 :: 痞客邦 ::
相關連結
- Laravel 使用二级缓存提高缓存命中率和内存使用效率 - 探花的 Blog
- Laravel 在 with 查询中只查询个别字段 | Laravel China 社区 - 高品质的 Laravel 开发者社区
- [擴展推薦] Laravel Query Detector 數據模型查詢的 N+1 問題捕殺神器 | Laravel China 社區 - 高品質的 Laravel 開發者社區
- 在 Laravel 中使用 GraphQL 一【获取数据】 | Laravel China 社区 - 高品质的 Laravel 开发者社区
- 阻礙你使用 GraphQL 的十個問題 | 咀嚼之味
其他小記
GraphQL 小記
- TypeORM - 最好的 Node.js ORM 框架 - CNode 技术社区
- GraphQL 教程(六)—— N+1 问题和缓存等问题 | 豪翔天下
- Using DataLoader with GraphQL: A Concrete Example – codeburst
- 在 Laravel 中使用 GraphQL 一【获取数据】 | Laravel China 社区 - 高品质的 Laravel 开发者社区
- GraphQL Design: 使用 DataLoader 提升效能 ! - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
- 阻碍你使用 GraphQL 的十个问题 | 咀嚼之味
- GraphQL 入門: 簡介 X 範例 X 優缺點 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
- 2018 GraphQL 漸進式導入的架構 – Michael Hsu – Medium
sharding 小記
當下還沒有非常令人滿意的基於 hibernate 的 sharding 框架,(關於 hibernate hards 會在下文介紹),因此很多團隊會選擇自行實現 sharding。
原文網址:https://read01.com/AJO2Bm.html
ftp 小記
因為最近沒時間整理
所以先暫時貼在這
目前可能組put xxx
的 ftp 指令內容
最後在sftp < xxx.txt
會比較快
- List all files in a ftp folder in a text file [ bash ls ]
- How to upload (FTP) files to server in a bash script? - Stack Overflow
- bash - Get notified about new files on SFTP server - Ask Ubuntu
- 用二句 Shell 命令实现 FTP 批量上传文件夹 - linux48
- Upload files from a list via ftp in bash - Stack Overflow