我有表T1,其中列A是主鍵,列B是外鍵,它是表T2中的主鍵。我想在T1中創建一個索引,複合索引爲(B,A)。但MySQL允許我只將索引創建爲(A,B)。是否因爲col B是外鍵?請解釋一下帶有兩列的MySQL索引,其中一列是外鍵
回答
也能正常工作對我來說:
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
不包括聚集鍵在索引中的行指針,沒有什麼可以阻止明確加入該領域,有時需要優化一些查詢。
請檢查您的語法。
我覺得這沒有意義。 您正嘗試使用已經唯一的列(主鍵是唯一的)創建組合索引。
由於正在使用的InnoDB作爲存儲引擎,獨上B列一索引將包括柱A(主鍵)
http://www.mysqlperformanceblog.com/2006/10/03/mysql-optimizer-and-innodb-primary-key/
在我的情況下,實際上,列A和列B都是主鍵,COL B也是外鍵。所以mysql給你一個默認索引作爲複合(A,B)。但我想(b,a) – 2011-01-07 11:13:55
@patruni所以創建一個B上的索引,它將包括 - 幕後 - 列A也。 (因爲A是主鍵索引中最左邊的一列) – 2011-01-07 17:35:22
@Scrum Meister:但是我不需要在B上創建索引,因爲默認情況下,由於它的外鍵,mysql給了我一個索引。你的意思是說這個指數還包括幕後的A? – 2011-01-12 13:58:14
InnoDB的集羣使用主鍵數據。如果你沒有定義主鍵,InnoDB會嘗試使用唯一的不可爲空的索引。這將確保按順序插入行,併爲使用主鍵的連接提供更好的性能。但在我的問題中,我說過在表T1中,PK是col A,col B是在T1中不是唯一的外鍵。所以,如果我將pk設置爲(A,B),則自動將mysql索引爲主索引。如果您嘗試將索引更改爲(B,A),由於B不是唯一的,所以InnoDB無法將其索引爲索引,因爲它使用集羣索引。所以,它會拋出錯誤。
- 1. MySQL中的兩個單列索引與一個兩列索引?
- 2. 索引外鍵列
- 3. Mysql外鍵引用兩個列,它們是兩個不同表中的主鍵
- 4. 帶有散列索引的MySQL InnoDB表
- 5. 爲休眠表創建唯一的索引,其中一列是外鍵
- 6. 非主鍵列MySQL索引
- 7. MySql外鍵索引
- 8. 帶有外鍵的MySQL更改引擎
- 9. 外鍵在mySQL中必須是索引?
- 10. 帶有外鍵列表的SQL列
- 11. 一列,兩列或兩者的索引?
- 12. 讓MySQL使用一個索引/鍵值,其中1列和2列依次爲
- 13. 有沒有辦法讓一個表有兩列是外鍵引用兩個其他表?
- 14. MySQL的選擇列,而其他兩列是引用的表
- 15. 引用相同列的兩個外鍵
- 16. 由兩個外鍵引用的Oracle列
- 17. 兩列有一個關鍵值的索引
- 18. MySQL中的多列外鍵?
- 19. Laravel將外鍵引用移動到具有兩列的主鍵?
- 20. 引用同一列中的外鍵
- 21. MySQL中的兩列主鍵
- 22. 多列唯一索引鍵
- 23. MySQL主鍵列上的重複索引?
- 24. MySQL:非主鍵列上的索引
- 25. mySQL中帶有REPLACE功能的索引列
- 26. 創建已建立索引的列外鍵與MySQL工作臺
- 27. MySQL的 - 在其列使用索引
- 28. 具有主鍵的兩列而不是具有一個主鍵的兩列
- 29. 兩列作爲主鍵或一列作爲PK +索引?
- 30. MySQL - 多列唯一索引
您能否發表您正在使用的腳本? – Quassnoi 2011-01-19 11:10:37
和你得到的錯誤... – Unreason 2011-01-19 11:12:25