Laravel和Mysql通过带附加条件的pivot计算相关模型

6rqinv9w  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(138)

我有一个mysql查询(使用Laravel Eloquent的eager loading和withCount函数构建),它在处理大数据集时存在一些性能问题,下面有什么方法可以改进这个查询吗?
我需要获得所有的商店,以及与商店相关的产品计数(通过透视),但附加条件是,shops.type_id等于products.type_id。我认为这第二个条件导致了查询没有使用正确索引的问题。
两个模型之间有一个数据透视表。“
商店(标识,类型标识,所有者标识)产品(标识,类型标识)商店产品(商店标识,产品标识)
我有所有外键的索引,还有一个shop_product(shop_id,product_id)的复合索引
所以我的查询是这样的:

select
    shops.*,
    (
    select
        count (*)
    from
        products
    inner join shop_products on
        products.id = shop_products.product_id
    where
        shops.id = shop_products.shop_id
        and products.type_id = shops.type_id)
from
    shops
where
    shops.owner_id in (?)

字符串
这个查询有没有可能以某种方式进行优化,也许不使用laravel的withCount whereColumn查询?

... Shop::withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')]);


全文查询如下:

Shop::whereIn('owner_id', [123])
            ->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')])
            ->get()


我是否需要添加商店(id,type_id)和产品(id,type_id)的复合索引?

luaexgnf

luaexgnf1#

我没有测试这个,但我会尝试这样的东西:

Shop::whereIn('owner_id', [123])
            ->withCount(['products' => fn($query) => $query->select(['id','type_id'])->whereColumn('products.type_id', '=', 'shops.type_id')])
            ->get()

字符串
因此,我刚刚添加了选择几个字段(一个你需要和一个应用程序需要识别产品-但如果你只需要计数,我会尝试没有ID太)。
我假设当你得到“产品”时,它会拉取所有的数据,这将是缓慢的,特别是如果有“文本”类型的字段,如身体/描述等。
此外,不确定,但你可以尝试,而不是'products.type_id'type_id,因为你已经在'产品'的关系。您还可以检查以优化shops的拉取。

相关问题