2012-08-03 129 views
0

我所知道的是一個表格statistieken與一個IP,瀏覽器信息的散列,訪問的網址和最後訪問日期的時間戳。如何格式化這個mysql查詢

我可以從不同的來源編譯導致這個查詢,唯一的問題是這個查詢需要永久(9分鐘)完成一個約15000行的表上,所以這個查詢是非常低效的。

我想我會以這種錯誤的方式,但我找不到一個體面的帖子或教程如何使用選擇的結果作爲獲取我想要的結果的基礎。

我只想要的是表格中每個條目的概述,該條目與過去12小時內已經瀏覽了25頁以上的結果的散列相匹配。

CREATE TABLE IF NOT EXISTS `statsitieken` (
    `hash` varchar(35) NOT NULL, 
    `ip` varchar(24) NOT NULL, 
    `visits` int(11) NOT NULL, 
    `lastvisit` int(11) NOT NULL, 
    `browserinfo` text NOT NULL, 
    `urls` text NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

這是我試圖編譯到目前爲止的查詢。

SELECT * FROM `database`.`statsitieken` WHERE hash in (SELECT hash FROM `database`.`statsitieken` 
where `lastvisit` > unix_timestamp(DATE_SUB(
            NOW(),INTERVAL 12 hour 
            ) 
           ) 
group by hash 
having count(urls) > 25 
order by urls) 

我需要這在一個體面的時間來編譯,就像<1秒這應該是在我看來,可能的...

回答

1

我建議嘗試這個修改後的查詢。子查詢現在只計算被運行的每個記錄一次,而返回:

SELECT s.* 
FROM `database`.`statsitieken` s, (SELECT * 
FROM `database`.`statsitieken` 
WHERE `lastvisit` > UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 12 HOUR)) 
GROUP BY hash 
HAVING COUNT(urls)>25) tmp 
WHERE s.`hash`=tmp.`hash` 
ORDER BY s.urls 

確保您有以下字段的索引:

  • hash加快GROUP BYWHERE
  • urls加速ORDER BY
+0

那個問題是我沒有得到這個人訪問過的個人網址 – Tschallacka 2012-08-03 11:58:12

+0

我沒有理解任何東西。我剛剛更新了我的查詢。 – Jocelyn 2012-08-03 12:02:02

+0

謝謝。現在我明白爲什麼這個工作,而我沒有。謝謝你的啓發! – Tschallacka 2012-08-03 12:06:07

0

派生表INNER JOIN比子查詢快。試試這個優化查詢:

SELECT * 
FROM statsitieken a 
    INNER JOIN (SELECT hash 
       FROM statsitieken 
       WHERE lastvisit > unix_timestamp(DATE_SUB(
            NOW(),INTERVAL 12 hour 
            ) 
       ) b 
     ON a.hash = b.hash 
GROUP BY a.hash 
HAVING COUNT(urls) > 25 
ORDER BY urls; 

對於這個選擇查詢的更好的性能,你應該添加索引爲:

ALTER TABLE statsitieken ADD KEY ix_hash(hash); 

ALTER TABLE statsitieken ADD KEY ix_lastvisit(lastvisit); 
+0

它給en錯誤'#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第8行'b ON a.hash = b.hash GROUP BY a.hash HAVING COUNT(urls)'附近使用正確的語法。此外,這會將散列一起擠壓並且我仍然沒有得到該人訪問過的個人網址 – Tschallacka 2012-08-03 12:02:23

0
WHERE hash in (SELECT hash FROM `database`.`statsitieken` 
where `lastvisit` > unix_timestamp(DATE_SUB(
            NOW(),INTERVAL 12 hour 
            ) 
          ) 

您是「subquerying」(我不知道是否存在這個詞:P,'做子查詢')在同一張表中,爲什麼不能:

where `lastvisit` > unix_timestamp(DATE_SUB(
            NOW(),INTERVAL 12 hour 
            ) 

直接做?

+0

因爲我想用它做具體的事情。如果我把它全部放在一個查詢中,它會被團隊和東西壓垮。所以首先我需要得到所有符合我的參數的哈希值,然後我可以獲取我需要的具有這些哈希值的信息。 – Tschallacka 2012-08-03 11:57:43

+0

ahhh好,不反對那麼:P – 2012-08-03 12:19:52