MySQL索引有两列,其中一列是外键

时间:2011-01-05 08:48:13

标签: mysql foreign-keys indexing

我有表T1,其中col A是主键,col B是外键,它是表T2中的主键。我想在T1中创建一个索引,一个复合的索引为(B,A)。但是MySQL允许我仅将索引创建为(A,B)。是因为col B是外键吗?请解释

4 个答案:

答案 0 :(得分: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确实将聚簇键作为索引中的行指针包含在内,但没有任何内容可以阻止显式添加字段,有时需要优化某些查询。

请检查您的语法。

答案 1 :(得分:0)

我认为这没有意义。 您正在尝试使用已经唯一的列(主键是唯一的)来构建复合索引。

答案 2 :(得分:0)

由于您使用InnoDB作为存储引擎,因此仅B列的索引将包含A列(主键)

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

答案 3 :(得分:0)

InnoDB使用主键对数据进行聚类。如果您没有定义主键,InnoDB将尝试使用唯一的非可空索引。这将确保按顺序插入行,并为使用主键的连接提供更好的性能。但在我的问题中,我说在表T1中PK是col A,col B是外键,在T1中不是唯一的。因此,如果我将pk设置为(A,B),则自动将mysql索引为主索引。如果您尝试将索引更改为(B,A),由于B不是唯一的,因此InnoDB无法对其进行索引,因为它使用群集索引。所以,它会引发错误。