2012-01-17 61 views
0

基本形式組的查詢是:的MySQL查詢優化,範圍/綜合指數/由

EXPLAIN SELECT SUM(impressions) as impressions, SUM(clicks) as clicks, SUM(cost) as cost, SUM(conversions) as conversions, keyword_id FROM `keyword_track` WHERE user_id=1 AND campaign_id=543 AND `recorded`>1325376071 GROUP BY keyword_id 

看來,我可以索引說USER_ID,CAMPAIGN_ID和keyword_id並獲得GROUP BY沒有文件排序,但對記錄的一系列指標是真的要更積極地削減行,這個例子有一個很大的範圍,但其他查詢有一個更小的時間範圍。

表的樣子:

CREATE TABLE IF NOT EXISTS `keyword_track` (
`track_id` int(11) NOT NULL auto_increment, 
`user_id` int(11) NOT NULL, 
`campaign_id` int(11) NOT NULL, 
`adgroup_id` int(11) NOT NULL, 
`keyword_id` int(11) NOT NULL, 
`recorded` int(11) NOT NULL, 
`impressions` int(11) NOT NULL, 
`clicks` int(11) NOT NULL, 
`cost` decimal(10,2) NOT NULL, 
`conversions` int(11) NOT NULL, 
`max_cpc` decimal(3,2) NOT NULL, 
`quality_score` tinyint(4) NOT NULL, 
`avg_position` decimal(2,1) NOT NULL, 
PRIMARY KEY (`track_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

我已經離開我現在有出任何按鍵。基本上通過的問題是什麼將最好的辦法是在指數得到上仍然索引至少CAMPAIGN_ID和理想不需要對文件排序(雖然這可能是一個可以接受的折衷得到記錄的時間範圍指數)的範圍內。

回答

1

你在這種情況下,最好的指數是一個複合user_id + campaign_id + recorded

雖然這不會有助於避免,只要文件排序,你有recorded未在索引中包含的所有>比較group by場。

2

每當我們通過對錶的不同屬性的約束範圍約束和秩序,我們可以採取快速過濾或快速排序的結果集的優勢,但不能兩者兼得。

我的回答是... 如果你的範圍限制確實減少了大量的記錄併產生一小組行,更好的索引來支持範圍約束。即(user_id,campaign_id,記錄)

如果不是,我的意思是即使在經過驗證的範圍條件並且應該排序後仍然有大量的行,然後尋找支持排序的索引。 即(user_id,campaign_id,key_id)

爲了更好地理解這一點,請查看下面的鏈接,其中非常清楚地解釋了相同的事物。

http://explainextended.com/2009/04/01/choosing-index/

+1

感謝的是,並沒有真正前的範圍將如何阻止索引的其他部分被責令把握。 – 2012-01-23 03:43:57

+0

歡迎您 – Uday 2012-01-23 06:45:55