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的外键。他使用这些外键的名称作为索引的名称。
答案 0 :(得分:1)
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,如前所述。"
答案 1 :(得分:0)
如果创建外键约束,MySQL将在列上创建索引(如果它尚未存在),那么你是对的。但是,您可以随意在列上创建索引,并根据需要删除自动生成的索引。
您还可能需要其他多列索引来帮助查询这样的假设:
SELECT id, user, job
FROM assignments
WHERE job = 5
ORDER BY user
多列索引(job, user)
将同时满足搜索和排序,并且由于辅助索引包含主键,因此在这种情况下它也将充当覆盖索引。