在拉拉维尔表现不佳的地方
2022-08-30 16:13:22
我想将条件应用于关系。以下是我的工作:where
Replay::whereHas('players', function ($query) {
$query->where('battletag_name', 'test');
})->limit(100);
它生成以下查询:
select * from `replays`
where exists (
select * from `players`
where `replays`.`id` = `players`.`replay_id`
and `battletag_name` = 'test')
order by `id` asc
limit 100;
在70秒内执行。如果我手动重写查询,如下所示:
select * from `replays`
where id in (
select replay_id from `players`
where `battletag_name` = 'test')
order by `id` asc
limit 100;
它在0.4秒内执行。如果速度如此之慢,为什么默认行为?有没有办法使用查询生成器生成正确的查询,或者我是否需要注入原始SQL?也许我完全做错了什么?where exists
where in
replays
表有400万行,有4000万行,所有相关列都已编入索引,数据集不适合MySQL服务器内存。players
更新:发现正确的查询可以生成为:
Replay::whereIn('id', function ($query) {
$query->select('replay_id')->from('players')->where('battletag_name', 'test');
})->limit(100);
仍然有一个问题,为什么表现如此糟糕,为什么它是默认行为exists