2011-01-05 44 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无法将其索引为索引,因为它使用集群索引。所以,它会抛出错误。