2013-03-09 44 views
2

我有有這樣使用MySQL,是否有必要按照與索引相同的順序提及列?

combo1 => by_id, origin, genre 

索引的表藝術家我跑

SELECT * FROM artists 
    WHERE by_id = '324' 
     AND genre = 'rock' 
     AND origin = 'Australia' 

SELECT * FROM artists 
    WHERE by_id = '324' 
     AND origin = 'Australia' 
     AND genre = 'rock' 

顯然,在第二次查詢中的列被提及作爲查詢他們在索引中。當我在這些上運行EXPLAIN時,它說它使用索引。但是我有點困惑,第二個是否會比第一個更快。是嗎?

回答

-3

第二個查詢應該比第一個查詢更快。

列在索引定義中列出的順序很重要。可以僅使用第一個索引列來檢索一組行標識符。但是,僅在第二個或更大的索引列中檢索一組行標識符是不可能的或有效的(在大多數數據庫上)。

例如,想象一個電話簿,首先按城市,然後按姓氏,然後按名字排列。如果您獲得城市,您可以輕鬆提取該城市所有電話號碼的列表。但是,在這本電話簿中,查找給定姓氏的所有電話號碼將非常繁瑣。您必須在每個城市的部分查找具有該姓氏的條目。一些數據庫可以做到這一點,其他人則不會使用索引。

+0

這是不正確的。在where謂詞中使用正確的列是非常重要的。但列輸入的順序並不重要。 – javadba 2013-03-09 18:15:43

+0

@javadba:你是對的。 Sharad正在討論索引定義中的順序,而OP正在討論WHERE子句中的順序。後者並不重要,但前者確實如此。所以雖然沙拉德是正確的,但他們的答案並不是真正的答案。 – siride 2013-03-09 18:20:55

+0

@javadba:查詢中它的真實順序問題,你應該首先檢查索引的定義。 – Sharad 2013-03-09 18:59:09

3

只要列中包含列,優化器就會處理訂單沒有區別。

WHERE by_id = '324' AND origin = 'Australia' AND genre = 'rock' 
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |  KEY | KEY_LEN |    REF | ROWS |  EXTRA | 
------------------------------------------------------------------------------------------------------------------- 
| 1 |  SIMPLE | artists | const |  PRIMARY | PRIMARY |  80 | const,const,const | 1 | Using index |
WHERE by_id = '324' AND genre = 'rock' AND origin = 'Australia' 
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |  KEY | KEY_LEN |    REF | ROWS |  EXTRA | 
------------------------------------------------------------------------------------------------------------------- 
| 1 |  SIMPLE | artists | const |  PRIMARY | PRIMARY |  80 | const,const,const | 1 | Using index |

如果發生了離開了by_id,將未使用的指標(指標做工左至右)

WHERE genre = 'rock' 
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |  KEY | KEY_LEN | REF | ROWS |     EXTRA | 
--------------------------------------------------------------------------------------------------------------------- 
| 1 |  SIMPLE | artists | index |  (null) | PRIMARY |  80 | (null) | 1 | Using where; Using index |
WHERE origin='Australia' AND genre = 'rock' 
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |  KEY | KEY_LEN | REF | ROWS |     EXTRA | 
--------------------------------------------------------------------------------------------------------------------- 
| 1 |  SIMPLE | artists | index |  (null) | PRIMARY |  80 | (null) | 1 | Using where; Using index |
+0

這是正確的答案 – javadba 2013-03-09 18:16:31

+0

非常感謝@Aarolama Bluenk – sanchitkhanna26 2013-03-09 18:21:27

相關問題