2012-06-18 117 views
2

我在使用MySQL,儘管我懷疑這是一個通用的數據庫問題。創建索引是MySQL中另一個索引的子集

我有一個由6個數字列組成的表格。其中前5個組成主鍵。

這是一張大桌子(2000萬行和增長),所以一些查詢需要時間 - 大約10secs,本身不是太長,但我需要運行很多。

我明白了主鍵自動索引 - 它有什麼優勢在我單獨索引的主鍵,我通常在查詢欄目內某些羣體?

也就是說,,如果我在5分主鍵列第3定期查詢,我應該創建這3個額外的指標,或者是多餘的,因爲它已經是主鍵索引的一部分?

+0

是你的表的InnoDB或MyISAM數據 – mtariq

+0

,我使用的是InnoDB – mcmillab

回答

3

十秒鐘是一個相當長的時間返回一個或行的極少數的查詢。如果查詢返回表格內容的3%,則十秒不會太長。

您的主要唯一密鑰由綜合指數備份,讓我們說上

(I1,I2,I3,I4,I5) 

索引你是正確的,像

WHERE I1 = val AND I2 = val AND I3 = val 

WHERE I3 = val AND I2 = val AND I1 = val 

查詢應該使用爲主鍵創建的索引。重要的是,在綜合指數中的列都使用,從最左邊的一個。查詢如

WHERE I3 = val AND I4 = val AND I5 = val 

將不會很好地使用主鍵的組合索引。無論是將一個查詢,確實某種在關鍵提到的列值計算的,像

WHERE I1+I2+I3=sumvalue 

請記住,「應該工作」是不一樣的「不工作」。嘗試在MySQL中使用EXPLAIN命令找出DBMS是否做你期望它爲您的查詢內容。

http://dev.mysql.com/doc/refman/5.1/en/explain.html

+0

感謝Ollie,這非常有幫助 – mcmillab

0

爲什麼不只是創建一些測試查詢,在表的副本上創建索引並查看其執行方式?

說到績效,衡量總是比信任意見好。

數據庫中的「最佳」解決方案在很大程度上取決於涉及的表的具體細節。在列中的值範圍,值的分佈,查詢的類型,選擇/刪除/插入/更新查詢的相對頻率等。

這就是說,我的猜測是,子集上的索引將如果該子集包含查詢中使用的所有列,請予以幫助。如果在索引中包含結果集(select中的列),則可能會獲得更好的性能。

+0

感謝馬亭,這是很好的建議。但是我確實試圖做到這一點,並沒有得出確鑿的結果,所以我很想理解它在理論上是否應該有所作爲。 – mcmillab