【问题标题】:MySQL table foreign key indexes on primary index columns主索引列上的 MySQL 表外键索引
【发布时间】: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) 上 ;

【问题讨论】:

    标签: mysql indexing foreign-keys


    【解决方案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)中的列没有被索引,您将收到错误消息。你的看起来像是他们各自表上的主键,所以你应该没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2015-05-12
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多