2011-02-17 37 views
0

我必須做一個選擇在這樣一個表:需要在AND語句中對列進行索引?

  • ID
  • 用戶名
  • 速度
  • is_running

的說法是這樣的:

SELECT * 
    FROM mytable 
WHERE username = 'foo' 
    AND is_running = 1 

我有一個關於「userna」的索引我」。如果我正在運行上述語句,是否還需要索引「is_running」以獲得最佳性能?或者只有選擇的第一列有所作爲?我正在使用MySQL 5.0。

+0

假設`is_running`是布爾索引,索引也不會有所作爲,因爲沒有足夠的可能性。 – dnagirl 2011-02-17 21:35:26

+0

什麼是用戶名索引選擇性? (即總共有多少行,以及有多少個唯一的用戶名) – 2011-02-17 21:36:59

回答

0

它最終將取決於表中數據量是否需要索引。在很多情況下,引擎可能只是進行表掃描,並且如果認爲速度更快,則可以忽略所有索引。你有100個用戶,還是100,000個用戶?

在一個bit/bool列上,你不會利用大量的索引存儲空間,所以它可能不會受到傷害,除非你有非常高的插入率。

+0

如果MySQL預計會得到超過30%的命中數,那麼它將忽略索引,因此如果分配非常偏斜,它很可能會被忽略。 – dnagirl 2011-02-17 21:37:24

1

這取決於您正在存儲的數據類型。如果它是布爾型的,那麼你可能不會僅僅從該列索引中獲得收益。你可能想嘗試在兩列添加複合索引:

ALTER TABLE mytable ADD INDEX `IDX_USERNAME_IS_RUNNING` (`username` , `is_running`); 
0

如果你有100萬個用戶,只有1或2臺運行在任何一個時間 - 通過is_running,它肯定,指數會給你出色的表現。這個特定的用例最好在列上有兩個索引,分別是 - username,isrunning。 2索引的原因是如果您要求is_running=0,在這種情況下它使用username索引。

否則,組合索引(username,isrunning)有0%的機會可以幫助任何事情。堅持使用用戶名的單一索引。

最後,你真的需要整個記錄嗎?選擇 *?在接近tipping point的某些情況下(當MySQL 認爲索引+查找的效率低於直接掃描時),可以使此查詢的運行速度比原始查詢快。對(用戶名,ID)

SELECT mytable.* 
FROM (
SELECT id 
    FROM mytable 
WHERE username = 'foo' 
    AND is_running = 1 
) X 
INNER JOIN mytable on mytable.id = X.id