[英]Laravel Join tables and group by sum query too slow
我正在使用 Laravel 查詢構建器從數據庫中獲取所需的結果。 以下查詢是否工作正常但需要太多時間才能獲得結果。 你能幫我解決這個問題嗎?
select
`amz_ads_sp_campaigns`.*,
SUM(attributedUnitsOrdered7d) as order7d,
SUM(attributedUnitsOrdered30d) as order30d,
SUM(attributedSales7d) as sale7d,
SUM(attributedSales30d) as sale30d,
SUM(impressions) as impressions,
SUM(clicks) as clicks,
SUM(cost) as cost,
SUM(attributedConversions7d) as attributedConversions7d,
SUM(attributedConversions30d) as attributedConversions30d
from
`amz_ads_sp_product_targetings`
inner join `amz_ads_sp_report_product_targetings` on `amz_ads_sp_product_targetings`.`campaignId` = `amz_ads_sp_report_product_targetings`.`campaignId`
inner join `amz_ads_sp_campaigns` on `amz_ads_sp_report_product_targetings`.`campaignId` = `amz_ads_sp_campaigns`.`campaignId`
where
(
`amz_ads_sp_product_targetings`.`user_id` = ?
and `amz_ads_sp_product_targetings`.`profileId` = ?
)
group by
`amz_ads_sp_product_targetings`.`campaignId`
解釋 SQL 的結果
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE amz_ads_sp_report_product_targetings ALL campaignId NULL NULL NULL 50061 Using temporary; Using filesort
1 SIMPLE amz_ads_sp_campaigns ref campaignId campaignId 8 pr-amz-ppc.amz_ads_sp_report_product_targetings.ca... 1
1 SIMPLE amz_ads_sp_product_targetings ref campaignId campaignId 8 pr-amz-ppc.amz_ads_sp_report_product_targetings.ca... 33 Using where
您的查詢可以從幾個索引中受益,以涵蓋WHERE
子句以及連接條件:
CREATE INDEX idx1 ON amz_ads_sp_product_targetings (
user_id, profileId, campaignId);
CREATE INDEX idx2 ON amz_ads_sp_report_product_targetings (
campaignId);
CREATE INDEX idx3 ON amz_ads_sp_campaigns (campaignId);
第一個索引idx1
覆蓋了整個WHERE
子句,這可能會讓 MySQL 在amz_ads_sp_product_targetings
表的初始掃描時丟棄許多記錄。 它還包括第一次加入所需的campaignId
列。 第二個和第三個索引覆蓋每個表的連接列。 這可能讓 MySQL 在連接過程中進行更快速的查找。
請注意,選擇amz_ads_sp_campaigns.*
是無效的,除非campaignId
該表的是主鍵。 此外,我們不能做太多其他事情來加速查詢,因為SUM
其性質而言,需要接觸每條記錄才能得出結果總和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.