主索引列上的 MySQL 表外键索引

Posted

技术标签:

【中文标题】主索引列上的 MySQL 表外键索引【英文标题】:MySQL table foreign key indexes on primary index columns 【发布时间】:2018-10-02 02:45:57 【问题描述】:

我已经为具有如下主键(UsersID、AccountsID)的帐户/用户创建了一个表。我应该为 Users 表添加索引吗?

创建表 AccountsUsers ( AccountsID int 无符号不为空, 用户 ID int 无符号不为空, 角色 bigint unsigned null, 主键(UsersID、AccountsID)、 约束 AccountsUsers_Accounts_ID_fk 外键 (AccountsID) 引用 Accounts (ID) 在更新级联上删除级联, 约束 AccountsUsers_Users_ID_fk 外键 (UsersID) 引用用户 (ID) 更新级联 删除级联 ) 引擎=InnoDB ; 创建索引 AccountsUsers_Accounts_ID_fk 在 AccountsUsers (AccountsID) 上 ;

【问题讨论】:

【参考方案1】:

如果需要,mysql 会自动为外键创建必要的索引。

如果你的外键是UsersId,它可以使用你主键的左列。它不需要为该外键创建新索引。

如果是 AccountsId 上的外键,MySQL 会自动创建一个新索引。它不能使用 AccountsId 是主键的一部分这一事实,因为它不是最左边的列。

执行CREATE TABLE 后,运行SHOW CREATE TABLE AccountsUsers,您应该会看到它为AccountsId 创建的新索引。

【讨论】:

嗨@Bill。一张表有(A,B,C)复合主键和(A,B)复合外键和C外键。你能告诉我如何索引吗?我认为工作台做得很奇怪; (A,B) 综合指数和 (C,B,A) 综合指数。 (A,B)外键不需要额外的索引,可以使用主键作为索引。 C 外键需要一个包含 C 作为最左列的索引。我认为不会为此创建索引 (C,B,A)。它必须由其他东西创建。【参考方案2】:

来自documentation

MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

换句话说,如果您的引用表 (AccountsUsers) 的列上还没有所需的索引,MySQL 将为您创建它们。

如果引用表(AccountsUsers)中的列没有被索引,您将收到错误消息。你的看起来像是他们各自表上的主键,所以你应该没问题。

【讨论】:

以上是关于主索引列上的 MySQL 表外键索引的主要内容,如果未能解决你的问题,请参考以下文章

Oracle外键需要建索引吗?

MySQL是不是自动索引外键列?

数据库中的主键、关键字、索引

索引优化

怎么取消自增列上的聚集索引

TEXT 列上的 MySQL 索引无效