2010-12-06 27 views
1

我已經轉換Web服務器訪問日誌到MySQL表中創建一個有效的指標,它看起來像這樣:如何爲下面的查詢

CREATE TABLE `access_log` (
`timestamp` int(11) NOT NULL default '0', 
`visitorid` int(11) default NULL, 
`url` int(11) default NULL, 
`params` int(11) default NULL, 
`status` smallint(3) NOT NULL default '0', 
`bytes` int(20) NOT NULL default '0', 
`referrer` int(11) default NULL, 
`refparams` int(11) default NULL, 
`useragentid` int(11) default NULL, 
`keywords` int(11) default NULL, 
`country` char(3) default '', 
`crawl` int(1) NOT NULL default '0', 
`sessionid` int(11) default NULL, 
KEY `timestamp` (`timestamp`), 
KEY `visitorid` (`visitorid`), 
KEY `url` (`url`), 
KEY `referrer` (`referrer`), 
KEY `keywords` (`keywords`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1; 

我有,對於產生「最受歡迎的網頁」報告查詢在一定日期範圍,一個例子是這樣的:當有大量的表中的記錄

select url, 
count(distinct visitorid) as visitors, 
count(*) as hits 
from access_log where 
timestamp >=1270072800 and timestamp <=1272664799 
and crawl=0 
group by url order by visitors desc limit 100; 

此查詢獲取相當緩慢。

根據相對於表中記錄總數的時間戳範圍,優化程序表示它將使用'timestamp'或'url'鍵。但是,它總是提到'使用哪裏;使用臨時;使用filesort'

有沒有什麼辦法可以創建一個組合索引來改善這個查詢的執行時間?

我已經試過以下組合,但優化似乎忽略它們:

  1. IDX(時間戳,URL,visitorid,爬)
  2. IDX(URL,visitorid,爬行,時間戳)

任何建議或指針,我失蹤將不勝感激。

謝謝!

+0

對`timestamp`的簡單索引怎麼樣? – 2010-12-06 17:13:46

+0

表格在時間戳上已經有了一個簡單的索引,我試圖找到能給我更多速度的東西,謝謝 – Michael 2010-12-06 21:45:37

+0

爲什麼你想要製作一個單一的組合索引? – Donnie 2010-12-06 23:04:50

回答

0

因此,您想要在給定時間段內按受歡迎程度對網址進行排名。 (URL,visitorid)上的綜合索引會讓你受歡迎。 綜合指數(時間戳,網址)會給你在期間訪問的網址。爲什麼不試試這兩個指標,並做了加入與內嵌視圖,這樣的事情(不知道確切的語法在MySQL的內嵌視圖):

 select distinct URL from log as Log1 
        where visitdatetime > x and visitdatetime< y 


     join 

     (select url, count(distinct visitorid) as DistinctVisitors 
     from log 
     group by url 
     -- having count(distinct visitorid) > {some cutoff value greater than 1} 
     -- try the composite index (url, visitorid, visitdate) 
     having vistdate > x and visitdate < y 
     ) as Log2 


     on Log1.url = log2.url 

     order by DistinctVisitors desc 
0

分區的訪問日誌到多個表,只有在日期範圍內的表上運行此查詢。

製作彙總表,其中包含每日/每週/每月預先彙總的數據,以減少需要處理的數據量以生成報告。因此,在導入日誌文件之後,通過將時間戳分爲小時邊界,然後再劃分爲日邊界等來聚合數據。