我有一个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)的复合索引?
1条答案
按热度按时间luaexgnf1#
我没有测试这个,但我会尝试这样的东西:
字符串
因此,我刚刚添加了选择几个字段(一个你需要和一个应用程序需要识别产品-但如果你只需要计数,我会尝试没有ID太)。
我假设当你得到“产品”时,它会拉取所有的数据,这将是缓慢的,特别是如果有“文本”类型的字段,如身体/描述等。
此外,不确定,但你可以尝试,而不是
'products.type_id'
做type_id
,因为你已经在'产品'的关系。您还可以检查以优化shops
的拉取。