A quick fix for Laravel’s slow whereIn
Laravel 使用 ORM 時常會用到 whereIn。最近遇到傳入的陣列太大,結果完全查不到資料。查了之後才發現,Eloquent 底層使用 PDO::prepare(),而資料庫(MySQL、MariaDB)有一個 in_predicate_conversion_threshold 參數,專門用來優化 IN() 子句。預設值是 1000,超過時查詢會被改寫成子查詢的形式。因此,IN 子句綁定超過 999 個項目時會出問題:資料庫會回傳 0 筆結果,而且不會報錯。
解決方式
改用 whereIntegerInRaw,確保陣列的值都是整數:
Entity::whereIntegerInRaw('id', $array)->get();
延伸閱讀
- 【Laravel】N+1 問題:偵測與解決完整指南:同樣是 Eloquent 查詢效能問題,N+1 是更常見的陷阱
- 【MySQL】Index 設計與 EXPLAIN 分析實戰:查詢慢時也可以用 EXPLAIN 與索引設計來定位原因
No comments yet.