2017-09-06 58 views
1

我在加入多個包含數百萬數據的表時遇到了order by的問題。但我得到的解決方案具有鮮明的作爲,而不是加盟EXISTS將從以下問題如何使用order by,group by and join來提高查詢性能

How to improve order by performance with joins in mysql

SELECT 
    `tracked_twitter` . *, 
    COUNT(*) AS twitterContentCount, 
    retweet_count + favourite_count + reply_count AS engagement 
FROM 
    `tracked_twitter` 
    INNER JOIN 
     `twitter_content` 
     ON `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id` 
    INNER JOIN 
     `tracker_twitter_content` 
     ON `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id` 
WHERE 
    `tracker_twitter_content`.`tracker_id` = '88' 
GROUP BY 
    `tracked_twitter`.`id` 
ORDER BY 
    twitterContentCount DESC LIMIT 20 OFFSET 0 

提高性能,但該方法解決了,如果我只需要結果從父表中設置。如果我想在父表之外執行分組計數和其他數學函數呢?我寫了一個解決我的標準的查詢,但需要20秒才能執行。我怎樣才能優化它?

在此先感謝

+3

GROUP BY無效。將在新版本的MySQL上引發錯誤(除非在兼容模式下),並且在舊版本中返回不可預測的數據。一般的GROUP BY規則說:「如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或作爲set函數的參數。」 – jarlh

+0

請確認您的所有專欄名稱。 「is_influencer」來自哪個表? 'tracked_twitter_id'? –

+0

@GordonLinoff我剛剛編輯了where條件,錯誤地添加了這兩個條件。 – Tamizharasan

回答

2

鑑於查詢已經是相當簡單的我會來看一下,是選擇...

  • 執行計劃(找到你可以添加任何缺失索引)
  • 緩存(確保SQL已經在RAM中的所有數據)
  • 去正常化(打開查詢到平選擇)
  • 緩存中的數據在應用程序中(這樣你就可以使用somethi NG像PLINQ就可以了)
  • 使用基於RAM的存儲(Redis的,彈性)
  • 文件組的調整(物理移動的數據庫,以更快的光盤)
  • 分區的表(到分佈在多個物理磁盤的原始數據)

越往下走這個列表越是涉及解決方案。 我想這取決於你需要查詢的速度有多快,以及你需要多少解決方案來擴展。