我想申請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