gpt4 book ai didi

mysql - 使用 Eloquent whereNotIn 时查询非常慢

转载 作者:行者123 更新时间:2023-11-29 06:56:01 28 4
gpt4 key购买 nike

我有一个 Question来自非常大的问题表(600,000 条记录)的模型,与 Customer 相关, AnswerProduct楷模。关系与这个问题无关,但我提到它们是为了澄清我需要使用 Eloquent。当我调用Question::with('customer')->get();时它运行平稳且快速。

但是还有另一个表,其中我有 question_id不应显示的所有问题(出于特定原因)。

我尝试了这段代码:

    // omitted product ids, about 95,000 records
$question_ids_in_product = DB::table('question_to_product')
->pluck('product_id')->all();
$questions = Question::with('customer')
->whereNotIn('product_id', $question_ids_in_product)
->paginate($perPage)->get();

花费了很多时间并显示此错误: SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders

有时Fatal error: Maximum execution time of 30 seconds exceeded

当我使用普通 sql 查询运行它时:

SELECT * FROM questions LEFT JOIN customers USING (customer_id)
WHERE question_id NOT IN (SELECT question_id FROM question_to_product)

只需80毫秒

在这种情况下我该如何使用 Eloquent?

最佳答案

您可以使用 whereRaw方法:

$questions =  Question::with('customer')
->whereRaw('question_id NOT IN (SELECT question_id FROM question_to_product)')
->paginate($perPage)->get();

但理想情况下,您发现这是一个更好的解决方案:

Question::with('customer')->whereNotIn('question_id', 
function ($query) {
$query->from('question_to_product') ->select('question_id');
}
);

区别?

  1. 当您将数据库迁移另一个数据库时,whereRaw 可能无法像您放入原始语句那样工作。这就是为什么我们有 Eloquent ORM 来处理这些转换并构建适当的查询来运行。

  2. 不会影响性能,因为 SQL 相同(对于 MySQL)

P.S:为了更好的调试,请尝试安装 this debug bar

关于mysql - 使用 Eloquent whereNotIn 时查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45570755/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com