【问题标题】:MySQL - indexing innodb foreign keysMySQL - 索引 innodb 外键
【发布时间】:2015-05-12 17:35:16
【问题描述】:

在 InnoDB 中索引外键的性能是否有所提高?据我所知read,InnoDB 会自动为外键创建索引。

这是给我创建表的查询。

DROP TABLE IF EXISTS `assignments`;

CREATE TABLE `assignments`
(
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `user` INTEGER NOT NULL,
    `job` INTEGER NOT NULL,
    `created_at` DATETIME,
    `updated_at` DATETIME,
    PRIMARY KEY (`id`),
    INDEX `job_fk1` (`user`),
    INDEX `job_fk2` (`job`),
    CONSTRAINT `job_fk1`
        FOREIGN KEY (`user`)
        REFERENCES `users` (`id`),
    CONSTRAINT `job_fk2`
        FOREIGN KEY (`job`)
        REFERENCES `jobs` (`id`)
) ENGINE=InnoDB;

在那里,他创建了名为 job_fk1 和 job_fk2 的外键。他用这些外键的名字作为索引的名字。

【问题讨论】:

  • 那些索引可能自动创建的。

标签: mysql database indexing foreign-keys


【解决方案1】:

你是正确的,MySQL 将在创建外键约束时在列上创建索引,如果它不存在的话。但是,您可以随意在列上创建一个索引,并根据需要删除自动生成的索引。

您可能还需要额外的多列索引来辅助查询,例如这种虚构的查询:

  SELECT id, user, job
  FROM assignments
  WHERE job = 5
  ORDER BY user

多列索引(job, user) 将满足搜索和排序,并且由于二级索引包含主键,在这种情况下它也可以作为一个覆盖索引。 p>

【讨论】:

    【解决方案2】:

    在 InnoDB 中索引外键的性能是否有所提高?

    答案:不会。由于重复键,性能会下降。

    你不需要

    INDEX `job_fk1` (`user`),
    INDEX `job_fk2` (`job`),
    

    这些将由 InnoDB 在内部自动创建。但是您需要在 users (id) 和 jobs (id) 上建立索引,以便在 assignments 表上进行更快的操作

    http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

    "InnoDB 需要在外键和引用键上建立索引,这样外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列被列为第一列相同的顺序。如果引用表不存在,则会在引用表上自动创建这样的索引。(这与一些旧版本相反,其中索引必须显式创建,否则创建外键约束将失败。) index_name ,如果给定,则如前所述使用。"

    【讨论】:

    • 主键是索引。也不需要这些列上的重复索引。
    • @MarcusAdams:是的,如果users (id) 和jobs (id) 是主键,则不需要索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多