두 모델 사이에는 중간 테이블이 있습니다.
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粉6183582602023-07-25 10:52:49
테스트해본 적은 없지만 비슷한 것을 시도해 보겠습니다
으아악그래서 방금 몇 가지 필드(필요한 필드와 앱에서 제품을 식별하는 데 필요한 필드)를 추가했지만 개수만 필요한 경우에는 ID 없이 시도해 보겠습니다.
"제품"을 얻을 때 모든 데이터를 가져오며 본문/설명 등과 같은 "텍스트" 유형 필드가 있으면 속도가 느려질 것이라고 가정합니다.
또한 확실하지 않지만 이미 제품 관계에 참여하고 있으므로 products.type_id 대신 type_id를 사용해 볼 수도 있습니다. 풀 스토어를 최적화하는 방법도 확인해 보세요.