我想申请where
条件关系。这是我做的:差在哪里Laravel性能
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秒内执行。为什么where exists
是默认行为,如果它太慢?有没有办法使用查询生成器生成正确的where in
查询,还是需要注入原始SQL?也许我完全搞错了什么?
replays
表有4M行,players
有40M行,所有相关列都被索引,数据集不适合MySQL服务器内存。
更新:发现正确的查询可以产生如下:
Replay::whereIn('id', function ($query) {
$query->select('replay_id')->from('players')->where('battletag_name', 'test');
})->limit(100);
还有一个问题,为什么exists
表现这么糟糕,为什么它是默认的行为
更快的查询我建议不要选择* ..尝试选择特定的属性而不是全部。 – parkway
我需要为我的情况选择所有这些。即使只选择“id”列,查询性能也会提高不到1%,因此可以忽略不计。 – Poma