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

uttx8gqw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(543)

我为帐户/用户创建了一个表,其主键(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)
;
webghufk

webghufk1#

如果需要,mysql将自动为外键创建必要的索引。
对于usersid上的外键,它可以使用主键的左列。它不需要为外键创建新索引。
对于accountsid上的外键,mysql将自动创建一个新索引。它不能使用accountsid是主键的一部分这一事实,因为它不是最左边的列。
在你完成任务之后 CREATE TABLE ,运行 SHOW CREATE TABLE AccountsUsers 您应该看到它为accountsid创建的新索引。

z4iuyo4d

z4iuyo4d2#

从文档中
mysql需要外键和引用键的索引,这样外键检查可以很快,并且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建这样的索引。如果您创建另一个可用于强制外键约束的索引,则稍后可能会自动删除此索引。索引名称(如果给定)如前所述使用。
换句话说,如果在引用表的列上还没有所需的索引( AccountsUsers ),mysql将为您创建它们。
如果引用表中的列( Accounts 以及 Users )如果没有索引,则会出现错误。你的表看起来像是它们各自表上的主键,所以你应该没事。

相关问题