2009-10-29 31 views
3

我有列的表(用戶)作爲mysql的多指標問題

id INT AUTOINVREMENT PRIMARY 
uid INT index 
email CHAR(128) UNIQUE 
activated TINYINT 

我會需要查詢這個表是這樣的:

SELECT * FROM users WHERE uid = ? AND activated = 1 

我的問題是,因爲有一個在'uid'列中設置索引,爲了獲得上述查詢的最佳性能,是否還需要爲'激活'列設置另一個索引?這個表(將是一個大表)將被'INSERT','UPDATE'語句以及'SELECT'語句大量訪問。

正如我從其他來源得知,索引與'INSERT'和'UPDATE'語句相反,所以如果uid列上的索引足以滿足上面的查詢,我將不必爲另一個索引設置另一個索引激活'插入&更新的性能。

回答

4

MySQL將只使用每個表1個指數,無論如何,所以有一個附加的索引也無濟於事。

不過,如果你想真正獲得最佳性能,確定在兩列索引順序如下:(例如1個跨2列指數)

index_name (uid, activated) 

,使優化的只是uid,或uid AND activated查詢。

+0

我相信這個問題更多的是關於如何打開一個索引,以獲得大量插入或更新的性能命中,而不是索引這兩個列會更好。 – catfarm 2009-10-29 00:51:18

+0

你的意思是設置一個索引2列(UID,激活)或設置兩個指標之一的uid和一個用於激活? – Shawn 2009-10-29 00:51:53

+0

@Shawn。是的,晚了,修好了,抱歉,謝謝! – gahooa 2009-10-29 14:38:17

0

這取決於你的數據分發和uid與的uid和激活的選擇性的選擇性。如果你有很多獨特的uid值,這將有很高的選擇性,即搜索uid = x只返回幾行,然後包括在索引中激活將提供很小的價值。而如果uid = x返回很多行並且uid = x並且激活= 1返回幾行,那麼索引中就有值。

很難提供一個明確的答案,而不知道數據分佈。

0

創建索引不會讓你選擇更慢。

但是,只有當您搜索不像事件時,它纔會使其顯着更快。

如果大多數客戶帳戶的激活和你搜索未激活的,或者反過來該指數將僅是有用的:大多數帳戶都非激活和你搜索激活個。

創建這個索引也將提高UPDATEDELETE併發:沒有這個指標,對於一個給定uid所有賬戶(包括激活和未激活的)將被鎖定爲UPDATE操作的InnoDB時間。

然而,一個附加的索引當然會妨礙DML性能。