MySQL - 索引innodb外键

时间:2015-03-11 03:18:03

标签: mysql database indexing foreign-keys

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的外键。他使用这些外键的名称作为索引的名称。

2 个答案:

答案 0 :(得分:1)

InnoDB中索引外键的性能有所改善吗?

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

您不需要

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

这些将由InnoDB在内部自动创建。但是您需要在usersid)和jobsid)上设置索引,以便在assignments

上更快地进行操作

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

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

答案 1 :(得分:0)

如果创建外键约束,MySQL将在列上创建索引(如果它尚未存在),那么你是对的。但是,您可以随意在列上创建索引,并根据需要删除自动生成的索引。

您还可能需要其他多列索引来帮助查询这样的假设:

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

多列索引(job, user)将同时满足搜索和排序,并且由于辅助索引包含主键,因此在这种情况下它也将充当覆盖索引。