>  Q&A  >  본문

2k로 Laravel의 foreach 루프를 최적화하고 200k에서 관계 검색을 개선하여 실행 시간을 줄입니다.

'제품'이라는 모델이 있습니다. Note_voucher_line이라는 모델이 있습니다

제품 내 관계입니다

으아악

이제 가끔은 이런 코드로 제품을 반복해야 합니다

으아악

모델 Note_voucher_line의 행 수가 300,000개가 넘습니다. migration에 색인이 있습니다 note_voucher_lines내부 인덱스 마이그레이션

입니다. 으아악

제품 테이블에는 product_id라는 인덱스가 있습니다. 더 빠르게 만드는 데 도움이 필요하세요? 감사합니다

P粉707235568P粉707235568176일 전369

모든 응답(2)나는 대답할 것이다

  • P粉492959599

    P粉4929595992024-03-31 12:05:45

    이 경우에는 관계를 열심히 로딩하는 것이 도움이 될 수 있습니다.

    으아악

    여기서 일어나는 일은 with() 方法在每次迭代中从 note_voucher_lines 테이블을 사용하여 이전에 로드된 한 행 대신 2,000개의 행(제품 테이블에 2,000개의 행이 포함되어 있다고 가정)을 미리 로드한다는 것입니다. 이렇게 하면 데이터베이스 서버에 대한 네트워크 호출 수가 줄어들고 이제 300k 호출 대신 300k/2k 호출이 이루어집니다.

    참고: 데이터가 계속 증가함에 따라 메모리 제한에 도달하지 않도록 제품에 블록 로딩을 사용하는 것도 고려해야 합니다. https://laravel.com/docs/10.x/eloquent#chunking-results

    회신하다
    0
  • P粉244730625

    P粉2447306252024-03-31 09:24:23

    지연의 주된 이유는 get_note_voucher_lines 관계의 지연 로딩 때문인 것 같습니다.

    루프 내에서 이 관계에 액세스할 때마다 Laravel은 관련 행을 가져오기 위해 별도의 쿼리를 만듭니다. 이른바 N+1 문제다.

    이 문제를 완화하려면 Eager 로딩을 사용하세요.

    으아악

    청킹을 사용하여 빅 데이터를 처리할 수도 있습니다.

    으아악

    ID 필드에 색인이 있는지 확인하세요. 인덱스가 있다고 말씀하셨는데, 외래 키 제약 조건이 아니라 적절한 인덱스인지 확인하세요.

    회신하다
    0
  • 취소회신하다