2011-05-29 98 views
2

請建議索引以優化以下查詢。我不允許重寫查詢,但創建索引:幫我優化此查詢

SELECT 
    `ADV`.`inds` as `c0`, 
    sum(`ADVpost`.`clk`) as `m0` 
FROM 
    (SELECT * 
    FROM advts 
    WHERE comp_id = 
     (SELECT comp_id 
     FROM comp 
     WHERE name = 'abc')) as `ADV`, 
     (SELECT dt_id, 
       comp_id, 
       b_id, 
       ad_id, 
       clk, 
       resp 
     FROM advts_post 
     WHERE comp_id = 
       (SELECT comp_id 
        FROM comp 
        WHERE name = 'abc')) as `ADVpost` 
WHERE 
    `ADVpost`.`ad_id` = `ADV`.`ad_id` 
GROUP BY 
    `ADV`.`inds` 
ORDER BY 
    ISNULL(`ADV`.`inds`), `ADV`.`inds` ASC 

用於查詢的解釋是:

select_type table  type possible_keys Extra 
PRIMARY  <derived2> ALL  null   Using temporary; Using filesort 
PRIMARY  <derived4> ALL  null   Using where; Using join buffer 
DERIVED  ADVpost  ALL  null   Using where 
SUBQUERY comp  ALL  null   Using where 
DERIVED  advts  ALL  null   Using where 
SUBQUERY comp  ALL  null   Using where 

現有指標如下:在

ADVpost > PRIMARY KEY (`dt_id`,`comp_id`,`b_id`,`ad_id`) 

comp > PRIMARY KEY (`comp_id`) 

advts > PRIMARY KEY (`ad_id`) 

謝謝提前。

+0

貌似嵌套查詢是不必要的,一對夫婦的加入與在'comp.name','advts.comp_id','advts_post.comp_id指標','advts_post.ad_id'和'advts.inds'就足夠了。 – Orbling 2011-05-29 12:25:07

+0

@如果我正確地閱讀了查詢,可以在'advts_post.ad_id'上加上索引。 – Tadeck 2011-05-29 12:27:35

+0

@Tadeck:我想你的意思是'advts.ad_id'(正如我列出的其他人)。我故意將它關閉,因爲它被列爲已有的「PRIMARY」。 – Orbling 2011-05-29 12:37:48

回答

0

這個查詢是一個狗晚餐 - 寫這個的人應該受到嚴厲的懲罰,而那個說你不能改寫它但是必須讓它跑得更快的人應該被槍殺。

鬆散子選擇!

MySQL不會很好地執行推謂(根本?)。

使用正確的連接,而不是和隱含的國家加入:

SELECT ap.inds, SUM(ap.clk) 
FROM advts_post AS ap 
, comp AS co 
, advts ad 
WHERE ap.comp_id = co.comp_id 
AND ad.comp_id = co.comp_id 
AND ap.comp_id = ad.comp_id 
AND co.name='abc' 
GROUP BY ap.inds 
ORDER BY ISNULL(ap.inds), ap.inds ASC 
2

好吧,也許我沒有與MySQL優化專家,但:

  • 如果有可能,合理,儘量避免子查詢在可能的情況(相反,它可能是更好地使單獨的查詢,然後通過所檢索的ID,如comp_id,與含查詢),上comp.name
  • 放索引,上advts_post.comp_id(單個),
  • 放索引
  • 放索引上advts_post.ad_id(單個),

也許它是相當簡單的,但應該至少稍微幫助它更快。告訴我們結果。

+0

抱歉,這些索引沒有幫助。 – gtm 2011-05-29 14:06:30