【问题标题】:MySQL indexing with a two columns, one of which is a foreign key具有两列的 MySQL 索引,其中一列是外键
【发布时间】:2011-06-03 21:13:38
【问题描述】:

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

【问题讨论】:

  • 能否请您发布您正在使用的脚本?
  • 你得到的错误...

标签: mysql foreign-keys indexing


【解决方案1】:

这对我来说很好用:

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 确实在索引中包含聚集键作为行指针,但没有什么可以阻止显式添加字段,有时需要优化某些查询。

请检查您的语法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在我的例子中,实际上 col A 和 B 都是主键,COL B 也是外键。所以mysql给你一个默认索引作为复合(A,B)。但我想要(b,a)
      • @patruni 所以在 B 上创建一个索引,它将在幕后包括 A 列。 (因为 A 是主键索引中最左边的列)
      • @Scrum Meister :但我不需要在 B 上创建索引,因为默认情况下 mysql 给我一个索引,因为它是一个外键。你的意思是说这个索引包括A也在幕后?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 2018-06-22
        • 2018-10-02
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多