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

时间:2018-04-21 16:03:00

标签: mysql indexing foreign-keys

我为帐户/用户创建了一个表,其中包含主键(UsersID,AccountsID),​​如下所示。我应该为Users表添加索引吗?

create table AccountsUsers
(
    AccountsID int unsigned not null,
    UsersID int unsigned not null,
    Roles bigint unsigned null,
    primary key (UsersID, AccountsID),
    constraint AccountsUsers_Accounts_ID_fk
        foreign key (AccountsID) references Accounts (ID)
            on update cascade on delete cascade,
    constraint AccountsUsers_Users_ID_fk
        foreign key (UsersID) references Users (ID)
            on update cascade on delete cascade
)
engine=InnoDB
;

create index AccountsUsers_Accounts_ID_fk
    on AccountsUsers (AccountsID)
;

2 个答案:

答案 0 :(得分:0)

来自documentation

  

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

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

如果引用表(AccountsUsers)中的列未编入索引,则会出错。你看起来他们将成为各自桌子上的主键,所以你应该没问题。

答案 1 :(得分:0)

如有必要,MySQL将自动为外键创建必要的索引。

对于UsersId上的外键,它可以使用主键的左列。它不需要为该外键创建新索引。

对于AccountsId上的外键,MySQL将自动创建一个新索引。它不能使用AccountsId是主键的一部分,因为它不是最左边的列。

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