2010-06-30 79 views
1

說,如果我有一個查詢,如下所示:MySQL的 - 多列索引的順序

SELECT * FROM table WHERE category='5' and status='1' LIMIT 5 

表有一個百萬行。

爲了加快速度,我創建了索引(狀態,類別),即多列索引。

有600個類別,但只有2個狀態(1或0)。我想知道如果我創建索引(類別,狀態)而不是索引(狀態,類別)是否有任何性能差異。

+0

您可以根據需要創建任意數量的索引。同時創建索引。 – Salil 2010-06-30 06:36:41

+2

索引不是免費的。告訴人們創造它們並不是明智的建議。需要有一個使用它們的理由,而且它們需要時間維護(特別是在插入時)。需要仔細選擇索引。這是假設聚集索引。 對於這個例子,要麼工作。 但是,如果您將索引用於其他工作,則需要小心。如果您在(狀態,類別)上創建索引並僅爲其他查詢選擇類別,則索引查找速度會低於(類別,狀態)。 – Chimmy 2010-06-30 06:43:47

回答

2

應該沒有什麼區別。無論您訂購它(類別,狀態)還是(狀態,類別),索引的選擇性都是相同的。

順便說一句,使用LIMIT通常沒有使用ORDER BY也沒有意義。除非您指定訂單,否則由SQL查詢返回的行的順序是任意的。


回覆您的評論:是的,這是常見的需5個隨機行,但任意是不一樣隨意。需要五個任意行是不常見的。

+1

沒意思?但是如果我只需要5行,不管訂單是什麼。有這個查詢有意義嗎? (當然,如果我添加ORDER BY會更好,但是恐怕會進一步減慢查詢的速度。) – 2010-06-30 06:39:31

3

狀態優先。 訣竅是,如果你只需要按類別查詢,你可以。

SELECT * from table where status in (1,0) and category = 'whatever' 

仍然得到索引支持。 當然,如果你的查詢都使用兩列,那麼它們的方法都是一樣的,,但在這種情況下,如果你只使用狀態,它會好得多,而且只有類別只有稍微差一些。

如果您也在查看大量插入內容,您希望最小化索引數量,所以這是您最好的選擇,而不是具有多個索引。

+0

+1在最小化索引時,如果插入是常見的。儘管費用很高,但很多人都會過分輕率地創建索引。 – Chimmy 2010-06-30 06:58:05