我有表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