2014-04-23 38 views
0

請參閱下面我想要優化的mysql查詢。我確信有這樣做的更有效的方式,但我只是不能爲我的生活工作。有人可以幫忙嗎?我認爲必須有一種方法來防止每個組的多個內部聯接。SQL查詢 - 計數組非常慢 - 幫助優化

SELECT network_name, count(*) as phone_count from 
deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE network_name != '' GROUP BY network_name UNION ALL 

SELECT tariff_contractlength, count(*) as phone_count from 
deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE tariff_contractlength != 1 GROUP BY tariff_contractlength UNION ALL 

SELECT offer_freegift, count(*) as phone_count from deals_temp d 
     INNER JOIN phones p ON d.model_id = p.model_id 
     INNER JOIN tariffs t ON d.tariff_id = t.tariff_id 
     INNER JOIN networks n ON d.network_id = n.network_id 
     INNER JOIN free_gift fg ON d.freegift_id = fg.freegift_id 
     INNER JOIN merchants m ON d.merchant_id = m.merchant_id 
     INNER JOIN type ty ON ty.type_id = d.type_id 
WHERE offer_freegift != '' GROUP BY offer_freegift 

好吧我會解釋一些,簡單地說。我認爲這可能很快。

所以,我有以下表

deals_temp

MODEL_ID | tariff_id |

123 | 1234

123 | 1235

123 | 1236

124 | 1237

手機

MODEL_ID | model_make | model_basename

123 | Apple | iPhone

124 | Apple | iPad的

關稅

tariff_id |資料名稱

1234 |無限30

我需要根據其他表中的不同值計算deals_temp中的交易數(行數),例如,電話(model_make)和資費(tariff_name)

輸出應爲:

元件|計數

iPhone | 123

iPad | 543

Apple | 453

無限30 | 564

+0

你爲什麼要數(*)?你不能只計算每行的唯一ID嗎? – Morgan

+1

就像我們知道你有什麼數據,什麼表結構和預期輸出一樣。您認爲我們應該如何幫助您提供您提供的信息? –

+0

非常好,由@juergend +1表示。 – Rahul

回答

0

第一步是確保您在內部加入的所有ID字段上都有索引。

第二步是確保您在where子句中引用的變量索引。 (network_name,tariff_contractlength,offer_freegift)

除此之外,當你拿走工會時,你有一些非常直接的問題,這意味着他們看起來並不複雜。

不確定mySQL是否有查詢優化器,您可以查看,但這將是一個開始的地方。我從查看查詢的猜測是,大部分時間都花在了加入數據上,這意味着要麼不需要加入太多數據,要麼加強服務器統計數據,要麼開始構建多維數據集.....(我不會推薦最後兩個)

+0

感謝您的回覆。所有的連接字段都設置爲主鍵,所以我認爲它們自然會被編入索引?這就是這篇文章的原因,我想知道是否有辦法停止所有多個連接,並且只有一次連接,然後從該表中完成計數。唯一想到的就是你如何創建一個多維數據集/新表,所以我可以在每個查詢中引用它。任何人有更多想法?在一個查詢中有更簡單的方法嗎? –