我已經轉換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'
有沒有什麼辦法可以創建一個組合索引來改善這個查詢的執行時間?
我已經試過以下組合,但優化似乎忽略它們:
- IDX(時間戳,URL,visitorid,爬)
- IDX(URL,visitorid,爬行,時間戳)
任何建議或指針,我失蹤將不勝感激。
謝謝!
對`timestamp`的簡單索引怎麼樣? – 2010-12-06 17:13:46
表格在時間戳上已經有了一個簡單的索引,我試圖找到能給我更多速度的東西,謝謝 – Michael 2010-12-06 21:45:37
爲什麼你想要製作一個單一的組合索引? – Donnie 2010-12-06 23:04:50