2014-10-08 39 views
3

我有一個疑問,這是我的表:MySQL的列順序在複合鍵

mysql> show create table watchdog\G 
*************************** 1. row *************************** 
    Table: watchdog 
    Create Table: CREATE TABLE `watchdog` (
     `index1` int(11) NOT NULL DEFAULT '0', 
     `index2` int(11) NOT NULL DEFAULT '0', 
     `dog` int(11) NOT NULL DEFAULT '9', 
     PRIMARY KEY (`index1`,`index2`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

    1 row in set (0.00 sec) 

< 1> 首先查詢:

select index1, index2 
from watchdog 
where index1 > 4000008 and index1 < 4200007; 

結果:

 
... 
| 4200001 | 4200002 | 
| 4200002 | 4200003 | 
| 4200003 | 4200004 | 
| 4200004 | 4200005 | 
| 4200005 | 4200006 | 
| 4200006 | 4200007 | 
+---------+---------+ 

199997 rows in set (0.09 sec) 

< 2> 第二個查詢:

select index1, index2 
from watchdog 
where index2 > 4000009 and index2 < 4200007; 

結果:

 
... 
| 4200002 | 4200003 | 
| 4200003 | 4200004 | 
| 4200004 | 4200005 | 
| 4200005 | 4200006 | 
+---------+---------+ 

199997 rows in set (1.68 sec) 

,他們所用的時間是0.9sec和1.68sec!有誰能告訴我爲什麼?複合鑰匙訂單有什麼問題?

回答

7

對於複合索引,MySQL有很好的documentation,您應該查看。讓我爲你查詢總結這個問題。

查詢的相關部分是where條款:

where index1 > 4000008 and index1 < 4200007; 
index2 > 4000009 and index2 < 4200007; 

index1, index2有一個指標,按照這個順序。在一般情況下,MySQL能夠看一個查詢,做的三件事情的指數之一:

  1. 決定不使用在所有的索引(基於統計或不適用的查詢)
  2. 決定使用index1零件。
  3. 決定使用index1組件index2

在第一個查詢中,MySQL可以選擇第二個選項。因此,它使用index1比較的索引。然後它可能會掃描相應的行,查看索引中的值index2,查找行ID,查找它們並返回行。

對於第二個where子句,它不能使用索引。索引的第一個鍵是index1,它不在查詢中。所以,MySQL必須進行全表掃描。

0

因爲您定義了一個複合鍵,只能在where子句中使用兩列或第一列時才能使用該鍵。

但是,您只能在緩慢查詢中使用密鑰的第二列。