2k로 Laravel의 foreach 루프를 최적화하고 200k에서 관계 검색을 개선하여 실행 시간을 줄입니다.
P粉707235568
P粉707235568 2024-03-30 13:42:11
0
2
496

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

제품 내 관계입니다

으아악

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

으아악

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

입니다. 으아악

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

P粉707235568
P粉707235568

모든 응답(2)
P粉492959599

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

으아악

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

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

P粉244730625

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

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

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

으아악

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

으아악

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿