2011-08-09 39 views
0

試圖讓最近computed_date其中normalized_global_score不爲NULLMySQL的指數最高與在

SELECT max(`influencer_brand_scores`.computed_date) AS max_computed_date 
FROM `influencer_brand_scores` 
WHERE (normalized_global_score IS NOT NULL) 

該查詢永遠走,當我在它上面運行解釋,我得到:

1個SIMPLE influencer_brand_scores ALL(空)(空)(空)(空)3347895使用其中

所以我的問題是,我在computed_date添加索引,或化合物在normalized_global_score和computed_date上的dex,如果是的話應該是第一個,還是這很重要?

+0

'NULL'對於索引是不好的,任何存儲'NULL'值的理由? – ajreal

+0

有一個夜間工作來計算normalized_global_score數量,所以它的值可能爲null的一段時間,因爲計算它的複雜性,我沒有看到任何簡單的方法來刪除它。 – Joelio

+0

在這種情況下,我認爲只有'computed_date'上的索引好得多,但是,我可能是錯的,請保留我的貼子 – ajreal

回答

0

我第一次去

INDEX(normalized_global_score, computed_date) 

,如果這沒有很好(因爲含normalized_global_score空值)工作將名爲normalize_gobalcolumn_score_is_computed和索引一個新的布爾列:

INDEX(normalize_gobalcolumn_score_is_computed, computed_date) 

並在您的查詢中將normalized_global_score IS NOT NULL替換爲normalize_gobalcolumn_score_is_computed = TRUE

+0

不要相信,與布爾字段,這將快得多。 – Karolis

+0

BOOLEAN是TINYINT(1)的同義詞,並且該類型的列將被正確索引並使用。我記得MySql總是在包含NULL的索引時遇到問題,所以我總是避免這種情況,但我不確定是否在MySql的更新版本中沒有解決這個問題。 – nobody

+0

從數學的角度來看,NULL值不成問題。問題是數據分佈。例如,如果所有表都具有非空值並且只有多個記錄具有空值,則該特定查詢可能會很慢。但TRUE/FALSE分配與NULL/NON-NULL分配相同,因此查詢仍然很慢。 – Karolis

0
ALTER TABLE `influencer_brand_scores` 
    ADD INDEX `ibs_cindex` (`normalized_global_score`, `computed_date`); 
+0

@Joelio更新!這應該足夠快。一切都取決於你有多少非空值。 – Karolis

+0

嗨,謝謝,我不認爲mysql支持ASC/DESC,在這種情況下不確定它很重要。 – Joelio

+0

@Joelio理論上,排序可能會增加單步選擇正確起點的概率。在這種情況下,它確實不會提高性能。在任何情況下,你是對的,我已經看了文檔,發現MySQL目前不支持索引排序:) – Karolis