'제품'이라는 모델이 있습니다. Note_voucher_line이라는 모델이 있습니다
제품 내 관계입니다
으아악이제 가끔은 이런 코드로 제품을 반복해야 합니다
으아악모델 Note_voucher_line
의 행 수가 300,000개가 넘습니다.
migration
에 색인이 있습니다
note_voucher_lines
내부 인덱스 마이그레이션
제품 테이블에는 product_id라는 인덱스가 있습니다. 더 빠르게 만드는 데 도움이 필요하세요? 감사합니다
이 경우에는 관계를 열심히 로딩하는 것이 도움이 될 수 있습니다.
으아악여기서 일어나는 일은
with()
方法在每次迭代中从note_voucher_lines
테이블을 사용하여 이전에 로드된 한 행 대신 2,000개의 행(제품 테이블에 2,000개의 행이 포함되어 있다고 가정)을 미리 로드한다는 것입니다. 이렇게 하면 데이터베이스 서버에 대한 네트워크 호출 수가 줄어들고 이제 300k 호출 대신 300k/2k 호출이 이루어집니다.참고: 데이터가 계속 증가함에 따라 메모리 제한에 도달하지 않도록 제품에 블록 로딩을 사용하는 것도 고려해야 합니다. https://laravel.com/docs/10.x/eloquent#chunking-results
지연의 주된 이유는 get_note_voucher_lines 관계의 지연 로딩 때문인 것 같습니다.
루프 내에서 이 관계에 액세스할 때마다 Laravel은 관련 행을 가져오기 위해 별도의 쿼리를 만듭니다. 이른바 N+1 문제다.
이 문제를 완화하려면 Eager 로딩을 사용하세요.
으아악청킹을 사용하여 빅 데이터를 처리할 수도 있습니다.
으아악ID 필드에 색인이 있는지 확인하세요. 인덱스가 있다고 말씀하셨는데, 외래 키 제약 조건이 아니라 적절한 인덱스인지 확인하세요.