관계에 where
조건을 적용하고 싶습니다. 여기에 내가 할 수있는 작업은 다음과 같습니다가난한 곳 Laravel의 성능이
Replay::whereHas('players', function ($query) {
$query->where('battletag_name', 'test');
})->limit(100);
그것은 다음 쿼리를 생성하고 70 초 실행
select * from `replays`
where exists (
select * from `players`
where `replays`.`id` = `players`.`replay_id`
and `battletag_name` = 'test')
order by `id` asc
limit 100;
합니다. 다음과 같이 수동으로 쿼리를 다시 작성하는 경우 :
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 서버 메모리에 맞지 않습니다.
업데이트 : 올바른 쿼리로 생성 할 수 있음을 발견 : exists
그렇게 가난하게 수행하고 기본 동작을 왜 왜
Replay::whereIn('id', function ($query) {
$query->select('replay_id')->from('players')->where('battletag_name', 'test');
})->limit(100);
아직도 질문이
에서 원시 쿼리 객체를 사용하지 않는 이유는 더 빠른 쿼리가 있다면 내가 * ..하려고 SELECT 말아 제안 모두 대신 특정 속성을 선택하십시오. – parkway
제 경우에는 모두 선택해야합니다. 그리고'id' 컬럼 만 선택해도 쿼리 성능이 1 % 이하로 향상되므로 무시할 수 있습니다. – Poma