MySQL未为外键创建索引

3
我读到InnoDB会自动为外键创建索引。
但是我的一些外键在表中没有索引。请检查“pharmaceutical_id”外键字段。它没有索引。 MySQL Workbench是否会自动为外键创建索引? MySQL是否会自动为外键列创建索引? https://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
| pharmaceuticals_pharmaceuticalcode | CREATE TABLE `pharmaceuticals_pharmaceuticalcode` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code_id` int(11) NOT NULL,
  `pharmaceutical_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `pharmaceuticals_pharmaceuticalco_pharmaceutical_id_5ae1e77e_uniq` (`pharmaceutical_id`,`code_id`),
  KEY `pharmaceuticals_phar_code_id_a7de9505_fk_human_api` (`code_id`),
  CONSTRAINT `pharmaceuticals_phar_code_id_a7de9505_fk_human_api` FOREIGN KEY (`code_id`) REFERENCES `human_api_code` (`id`),
  CONSTRAINT `pharmaceuticals_phar_pharmaceutical_id_04c18462_fk_pharmaceu` FOREIGN KEY (`pharmaceutical_id`) REFERENCES `pharmaceuticals_pharmaceutical` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=202770 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

我已在pharmaceutical_idcode_id上添加了唯一约束,这可能导致没有为pharmaceutical_id创建单独的索引,因为MySQL以B-Tree方式管理这些索引,而唯一约束键的索引可以用于它。
请查看https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html中第6条限制和条件。

InnoDB允许外键引用任何索引列或一组列。但是,在所引用的表中,必须存在一个索引,其中引用的列按相同顺序排列且为第一列。InnoDB添加到索引中的隐藏列也被视为索引列(请参见14.6.2.1节,“聚集和二级索引”)。

但是,如果上述观点是正确的,那么下面表格模式中为什么会有一个 member_id 索引呢?因为在 patients_membercard_member_id_661ac31abca894ae_uniq 独特索引出现后,patients_membercard_b5c3e75b 索引就变得多余了。
| patients_membercard | CREATE TABLE `patients_membercard` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `member_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `patients_membercard_member_id_661ac31abca894ae_uniq` (`member_id`,`name`),
  KEY `patients_membercard_b5c3e75b` (`member_id`),
  CONSTRAINT `patients_member_member_id_459e0d6970a32170_fk_patients_member_id` FOREIGN KEY (`member_id`) REFERENCES `patients_member` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1655520 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |

PS:上面的表格,模式是由 Django 创建的,并且在数据库上没有进行手动操作。

1个回答

3

你的外键确实有索引。

在许多情况下,MySQL将单词“KEY”和“INDEX”视为同义词。

请参见MySQL中使用INDEX与KEY有什么区别?


更新后的问题。

我认为Django负责定义额外的KEY patients_membercard_b5c3e75b (member_id)。它不会自动生成。也就是说,如果我在没有定义该KEY的情况下测试CREATE TABLE语句,则FOREIGN KEY不需要它。FOREIGN KEY可以使用UNIQUE KEY的左侧列member_id

我猜测创建Django的开发人员没有处理这种情况。他们假设每个FOREIGN KEY都需要自己的索引,并且他们更喜欢确保他们可以控制索引名称。因此,他们在CREATE TABLE语句中明确生成索引定义。


是的,在MySQL中,键和索引是相同的。但我的问题是第一个表中可能有较少的索引,或者第二个表中可能有额外的索引。我已经更新了问题。 - SHIVAM JINDAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接