2011-01-05 42 views
1

我有表T1,其中列A是主鍵,列B是外鍵,它是表T2中的主鍵。我想在T1中創建一個索引,複合索引爲(B,A)。但MySQL允許我只將索引創建爲(A,B)。是否因爲col B是外鍵?請解釋一下帶有兩列的MySQL索引,其中一列是外鍵

+0

您能否發表您正在使用的腳本? – Quassnoi 2011-01-19 11:10:37

+0

和你得到的錯誤... – Unreason 2011-01-19 11:12:25

回答

2

也能正常工作對我來說:

CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; 
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT NOT NULL REFERENCES t2(id)) ENGINE=InnoDB; 
CREATE INDEX ix_t1_b_a ON t1 (b, a); 

雖然InnoDB不包括聚集鍵在索引中的行指針,沒有什麼可以阻止明確加入該領域,有時需要優化一些查詢。

請檢查您的語法。

0

我覺得這沒有意義。 您正嘗試使用已經唯一的列(主鍵是唯一的)創建組合索引。

0

由於正在使用的InnoDB作爲存儲引擎,獨上B列一索引將包括柱A(主鍵)

http://www.mysqlperformanceblog.com/2006/10/03/mysql-optimizer-and-innodb-primary-key/

+0

在我的情況下,實際上,列A和列B都是主鍵,COL B也是外鍵。所以mysql給你一個默認索引作爲複合(A,B)。但我想(b,a) – 2011-01-07 11:13:55

+0

@patruni所以創建一個B上的索引,它將包括 - 幕後 - 列A也。 (因爲A是主鍵索引中最左邊的一列) – 2011-01-07 17:35:22

+0

@Scrum Meister:但是我不需要在B上創建索引,因爲默認情況下,由於它的外鍵,mysql給了我一個索引。你的意思是說這個指數還包括幕後的A? – 2011-01-12 13:58:14

0

InnoDB的集羣使用主鍵數據。如果你沒有定義主鍵,InnoDB會嘗試使用唯一的不可爲空的索引。這將確保按順序插入行,併爲使用主鍵的連接提供更好的性能。但在我的問題中,我說過在表T1中,PK是col A,col B是在T1中不是唯一的外鍵。所以,如果我將pk設置爲(A,B),則自動將mysql索引爲主索引。如果您嘗試將索引更改爲(B,A),由於B不是唯一的,所以InnoDB無法將其索引爲索引,因爲它使用集羣索引。所以,它會拋出錯誤。