簡體   English   中英

Laravel Join 表和 group by sum 查詢太慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM