gpt4 book ai didi

mysql - 使用 whereIn 查询 65k+ 条记录

转载 作者:行者123 更新时间:2023-11-29 09:29:16 45 4
gpt4 key购买 nike

我有导出功能,我想使用给定的 ID 进行查询和导出。我找到了使用 skip()take() 进行查询的解决方案,但是现在 whereIn('id', $ids) 给了我错误,因为它目前有 85k 条记录。

PDOException: SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders

我使用的解决方案是:

public function handle() {
$max = 5000;
$total = $this->givenIds->count();

$pages = ceil($total / $max);

for ($i = 1; $i < ($pages + 1); $i++) {
$offset = (($i - 1) * $max);
$start = ($offset == 0 ? 0 : ($offset + 1));

MyModel::whereIn('id', $givenIds)
->orderBy('created_at', 'desc')
->skip($start)
->take($max)
->get();

// $this->generateTempCsv();
}

// $this->combineTempCSVs()
}

这工作正常,没有瓶颈 - 直到出现太多占位符错误。现在我收到此错误,我尝试:

$query = MyModel::orderBy('created_at', 'desc')

foreach ($this->givenIds->chunk(2000) as $i => $chunk) {
if ($i == 0) {
$query = $query->whereIn('id', $chunk);
} else {
$query = $query->orWhereIn('id', $chunk);
}
}

这会产生相同的错误。

如果我想使用givenIds进行查询,并且仍然想保留“orderBy -created_at”而不造成瓶颈,我应该做什么?

给定的Ids来自Controller(如上面的代码是Job):

$givenIds = MyModel::select('id', 'created_at')
->where(function($q) use ($dateRange, $queries) {
$this->applyQueryFilters($q, $queries, $dateRange);
})
->orderBy('created_at', 'desc')
->pluck('id');

Exporter::dispatch($givenIds)->onQueue('export');

PS:我使用 $givenIds 的原因是因为有过滤器,首先我在应用过滤器后获得相关的 id,然后将 $givenIds 传递到作业中。获取 $givenIds 时是否需要按 id 排序并取决于其中的顺序?

最佳答案

尝试一下:在数据库配置文件的 sql 或用于连接数据库的驱动程序下,添加一个字段 options,如下所示

'options'=> [PDO::ATTR_EMULATE_PREPARES => true]

PHP API 事实上说 ( check this ):

Some drivers do not support native prepared statements or have limited support for them.

另一个解决方案应该是更改驱动程序,但我认为向database.php添加一行更容易做到

报告可能的副作用:这可能会将返回值转换为字符串,如果您使用 === 作为比较运算符,这将影响您的代码。您可以使用模型中的 protected $casts 变量来解决此问题(如果您使用的是 Laravel)

关于mysql - 使用 whereIn 查询 65k+ 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59054806/

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