我为帐户/用户创建了一个表,其主键(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条答案
按热度按时间webghufk1#
如果需要,mysql将自动为外键创建必要的索引。
对于usersid上的外键,它可以使用主键的左列。它不需要为外键创建新索引。
对于accountsid上的外键,mysql将自动创建一个新索引。它不能使用accountsid是主键的一部分这一事实,因为它不是最左边的列。
在你完成任务之后
CREATE TABLE
,运行SHOW CREATE TABLE AccountsUsers
您应该看到它为accountsid创建的新索引。z4iuyo4d2#
从文档中
mysql需要外键和引用键的索引,这样外键检查可以很快,并且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建这样的索引。如果您创建另一个可用于强制外键约束的索引,则稍后可能会自动删除此索引。索引名称(如果给定)如前所述使用。
换句话说,如果在引用表的列上还没有所需的索引(
AccountsUsers
),mysql将为您创建它们。如果引用表中的列(
Accounts
以及Users
)如果没有索引,则会出现错误。你的表看起来像是它们各自表上的主键,所以你应该没事。