찾다

 >  Q&A  >  본문

추가 조건을 사용하여 중간 테이블을 통해 Laravel 및 Mysql 관련 모델 수를 계산합니다.

<p>대량 데이터 세트를 처리할 때 성능 문제가 있는 MySQL 쿼리(Laravel Eloquent의 즉시 로딩 및 withCount 함수를 사용하여 구축됨)가 있습니다. 아래 쿼리를 개선할 수 있는 방법이 있습니까? </p><p>모든 매장을 가져와서 해당 매장과 관련된 제품 수를 계산해야 하는데(중간 테이블을 통해 연결됨), 매장의 type_id가 제품의 type_id입니다. 이 두 번째 조건으로 인해 쿼리가 올바른 인덱스를 사용하지 못하는 것 같습니다.

두 모델 사이에는 중간 테이블이 있습니다.

store(id, type_id, owner_id) product(id, type_id) store product(shop_id, product_id)

모든 외래 키에 대한 색인이 있습니다. shop_product(shop_id, product_id)에 대한 복합 인덱스. </p><p>제 질문은 이렇습니다:</p><p><br /></p> <pre class="brush:php;toolbar:false;">선택 상점.*, ( 선택하다 세다(*) ~에서 제품 내부 조인 shop_products on products.id = shop_products.product_id 어디 상점.id = shop_products.shop_id 및 products.type_id = 상점.type_id) ~에서 상점 어디 (?)</pre>의 Shops.owner_id; <p>이 쿼리는 이 라라벨의 withCount whereColumn 쿼리를 사용하지 않고 어떻게든 최적화될 수 있습니까?</p> <pre class="brush:php;toolbar:false;">... Shop::withCount(['products' => fn($query) => $query->whereColumn('products. type_id', '=', 'shops.type_id')]);</pre> <p>전체 쿼리는 다음과 같습니다.</p> <pre class="brush:php;toolbar:false;">Shop::whereIn('owner_id', [123]) ->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')]) ->get() <p>store(id, type_id)와 product(id, type_id)에 결합된 색인을 추가해야 하나요? </p>

P粉514458863P粉514458863498일 전608

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

  • P粉618358260

    P粉6183582602023-07-25 10:52:49

    테스트해본 적은 없지만 비슷한 것을 시도해 보겠습니다

    으아악

    그래서 방금 몇 가지 필드(필요한 필드와 앱에서 제품을 식별하는 데 필요한 필드)를 추가했지만 개수만 필요한 경우에는 ID 없이 시도해 보겠습니다.

    "제품"을 얻을 때 모든 데이터를 가져오며 본문/설명 등과 같은 "텍스트" 유형 필드가 있으면 속도가 느려질 것이라고 가정합니다.

    또한 확실하지 않지만 이미 제품 관계에 참여하고 있으므로 products.type_id 대신 type_id를 사용해 볼 수도 있습니다. 풀 스토어를 최적화하는 방법도 확인해 보세요.

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