2011-05-06 75 views
5

我將索引我在Where/Order中使用的所有列,還有什麼可以加速查詢的嗎?在超過100萬行的表上運行查詢

的查詢是非常簡單的,如:

SELECT COUNT(*) 
    FROM TABLE 
WHERE user = id 
    AND other_column = 'something'` 

我使用PHP 5中,MySQL客戶端版本4.1.22,我的表是MyISAM數據。

+0

您是否一次處理所有數據? – Ibu 2011-05-06 22:21:45

+0

嘗試計數(1) - 有些人認爲沒有差異-worth a shot - 也是id數字?另一列可以是不同類型的文本,例如枚舉或編號 – Rob 2011-05-06 22:22:30

+3

@Rob:'COUNT(*)'將已經使用索引。 – webbiedave 2011-05-06 22:29:06

回答

7

與您的DBA交談。運行您當地的showplan。對於像您的樣本這樣的查詢,我會懷疑idother_column列上的覆蓋索引會大大提高性能。 (我假設user是一個變量或niladic函數)。

一個很好的通用規則是索引中的列應該按照方差的降序從左到右。也就是說,價值變化最快的列應該是指數中的第一列,並且該列變化最小的列應該是指數中的最後一列。似乎不直觀,但你去了。查詢優化器喜歡儘可能縮小範圍。

1

如果您的所有查詢都包含用戶標識,那麼您可以從假定userid應該包含在每個索引中(可能作爲第一個字段)開始。 (?我們是否可以假設該用戶ID是高度選擇性的,即任何單個用戶沒有超過幾千記錄更多)

所以你的指標可能是:

user + otherfield1 
user + otherfield2 
etc. 

如果你的用戶ID 真的是有選擇性的,就像幾十條記錄一樣,那麼只要該字段的索引應該是非常有效的(亞秒級返回)。

「user + otherfield」索引的好處在於mysql甚至不需要查看數據記錄。該索引有一個指針爲每個記錄,它可以只計數指針。

+0

不,也可以使用myisam索引,只要能夠找到所需的所有內容,而不必查看記錄以查看比索引中的內容更多的字段。 – dkretz 2011-05-06 23:38:35