我將索引我在Where/Order中使用的所有列,還有什麼可以加速查詢的嗎?在超過100萬行的表上運行查詢
的查詢是非常簡單的,如:
SELECT COUNT(*)
FROM TABLE
WHERE user = id
AND other_column = 'something'`
我使用PHP 5中,MySQL客戶端版本4.1.22,我的表是MyISAM數據。
我將索引我在Where/Order中使用的所有列,還有什麼可以加速查詢的嗎?在超過100萬行的表上運行查詢
的查詢是非常簡單的,如:
SELECT COUNT(*)
FROM TABLE
WHERE user = id
AND other_column = 'something'`
我使用PHP 5中,MySQL客戶端版本4.1.22,我的表是MyISAM數據。
與您的DBA交談。運行您當地的showplan
。對於像您的樣本這樣的查詢,我會懷疑id
和other_column
列上的覆蓋索引會大大提高性能。 (我假設user
是一個變量或niladic函數)。
一個很好的通用規則是索引中的列應該按照方差的降序從左到右。也就是說,價值變化最快的列應該是指數中的第一列,並且該列變化最小的列應該是指數中的最後一列。似乎不直觀,但你去了。查詢優化器喜歡儘可能縮小範圍。
如果您的所有查詢都包含用戶標識,那麼您可以從假定userid應該包含在每個索引中(可能作爲第一個字段)開始。 (?我們是否可以假設該用戶ID是高度選擇性的,即任何單個用戶沒有超過幾千記錄更多)
所以你的指標可能是:
user + otherfield1
user + otherfield2
etc.
如果你的用戶ID 真的是有選擇性的,就像幾十條記錄一樣,那麼只要該字段的索引應該是非常有效的(亞秒級返回)。
「user + otherfield」索引的好處在於mysql甚至不需要查看數據記錄。該索引有一個指針爲每個記錄,它可以只計數指針。
不,也可以使用myisam索引,只要能夠找到所需的所有內容,而不必查看記錄以查看比索引中的內容更多的字段。 – dkretz 2011-05-06 23:38:35
您是否一次處理所有數據? – Ibu 2011-05-06 22:21:45
嘗試計數(1) - 有些人認爲沒有差異-worth a shot - 也是id數字?另一列可以是不同類型的文本,例如枚舉或編號 – Rob 2011-05-06 22:22:30
@Rob:'COUNT(*)'將已經使用索引。 – webbiedave 2011-05-06 22:29:06