2012-01-07 59 views
0

我有兩個表。一種是點擊日誌,記錄我們收到點擊的確切時間。第二個是美元/日表格,記錄我們每天在特定網站上獲得的金額。加速mysql查詢

我需要計算每個網站的每日每次點擊費用。查詢波紋管正在工作,但需要將近一分鐘。

這裏的結果說明:

id select_type  table   type possible_keys  key  key_len  ref  rows  Extra 
1 SIMPLE   click_log  ALL  url_id,click_time NULL NULL  NULL 1404209 Using where; Using temporary; Using filesort 
1 SIMPLE   daily_dollars ref  url_id,date   date 3   func 6   Using where 

和查詢:

SELECT date(click_log.click_time) AS DAY, 
     click_log.shorturl AS site, 
     daily_dollars.money AS earned, 
     count(click_log.click_id) AS clicks, 
     daily_dollars.money/count(click_log.click_id) AS CPC 
FROM `yourls_log` AS click_log, yourls_url_money AS daily_dollars 
WHERE click_log.click_time >= "2011-07-01" 
    AND click_log.url_id = daily_dollars.url_id 
    AND date(click_log.click_time) = daily_dollars.date 
GROUP BY DAY , click_log.shorturl 

什麼我可以做,以加快這?

表結構:

yourls_log 
---------- 
click_id 
click_time 
shorturl 
url_id 

yourls_url_money 
---------------- 
id 
url_id 
date 
money 
+2

能否請您發佈的表結構? – 2012-01-07 02:30:50

+0

對於如何加快查詢的速度,我在MySQL方面還不夠完善,但我可以做的建議是[使用明確的'JOIN'方法](http://mysqljoin.com/)。 – Bojangles 2012-01-07 02:32:22

+0

它是GROUP BY,因爲它不能使用索引,查詢變慢。如果沒有具體的理由,請嘗試刪除GROUP BY。順便說一下,從你的查詢中'DAY'指的是'click_log'.'click_time',並且由於時間可能在條目之間有很大差異,我沒有理由在'DAY'上分組,不是嗎? – Abhay 2012-01-07 02:43:30

回答

0

不知道爲什麼,但是這是要快得多(1.5秒):

SELECT m.date, c.shorturl, m.money, c.clicks, m.money/c.clicks AS CPC 
FROM yourls_url_money AS m 
LEFT JOIN (

SELECT date(click_time) AS 
DAY , url_id, shorturl, count(click_id) AS clicks 
FROM yourls_log 
WHERE click_time >= "2011-07-01" 
GROUP BY DAY , url_id, shorturl 
) AS c ON m.url_id = c.url_id 
AND m.date = c.day 
WHERE date >= "2011-07-01" 
0

如果你創建你的下一個DBMS視圖,然後查詢視圖,這個過程應該配發更快地完成。這主要是因爲視圖是已經收集的數據,而不是從偏移量查詢數據。

也看看你的服務器統計,它可能在太多的負載?

+0

謝謝,雖然服務器和mysql已經過很好的優化。我相信文件排序是問題的地方 – Eric 2012-01-07 04:01:57

0

我想這是你想要的東西:

SELECT DISTINCT date(click_log.click_time) AS DAY, 
    click_log.shorturl AS site, 
    daily_dollars.money AS earned, 
    count(click_log.click_id) AS clicks, 
    daily_dollars.money/count(click_log.click_id) AS CPC 
FROM `yourls_log` AS click_log, yourls_url_money AS daily_dollars 
WHERE click_log.click_time >= "2011-07-01" 
AND click_log.url_id = daily_dollars.url_id 
AND date(click_log.click_time) = daily_dollars.date 
ORDER BY DAY , click_log.shorturl 
+0

謝謝,雖然這隻返回一行...我需要每天/站點組合總數。 – Eric 2012-01-07 03:50:14