【问题标题】:Is the index on `parent` necessary here?这里是否需要 `parent` 的索引?
【发布时间】:2011-01-20 01:48:00
【问题描述】:
Create Table: CREATE TABLE `category` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `parent` bigint(20) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `parent_idx` (`parent`),
  CONSTRAINT `category_parent_category_id` FOREIGN KEY (`parent`) REFERENCES `category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

我不确定外键是否会隐含索引?

编辑

我没有看到假定的索引:

mysql> show index from category;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table    | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| category |          0 | PRIMARY    |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| category |          0 | name       |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| category |          1 | parent_idx |            1 | parent      | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.02 sec)

【问题讨论】:

  • @user198729:您没有看到另一个索引,因为如果您已经显式创建了外键,InnoDB 将不会为外键创建新索引。如果您不创建parent_idx,InnoDB 将为您创建一个(使用不同的名称)。

标签: mysql foreign-keys indexing


【解决方案1】:

在 SQL Server 中:外键不会自动创建索引。您将需要在需要的位置显式创建一个索引。这样做是因为您不一定要为每个 FK 编制索引,因为这会增加插入的开销。

【讨论】:

  • 不,InnoDB 确实会自动创建索引:“InnoDB 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描......这样的索引是在如果它不存在,则自动引用表。”来源:dev.mysql.com/doc/refman/5.1/en/…。是 SQL Server 不会在外键上自动创建索引。
  • 我想我只是假设它们在这方面是相同的。 FWIW,我认为 SQL Server 的行为更好,因为它提供了更多控制权。
【解决方案2】:

是的,你是对的。

KEYparent_idx(parent) 是冗余索引。

MySQL 将自动为 FOREIGN KEY 约束创建索引。

来自 MySQL 手册:

InnoDB 为 外键,它使用 index_name 索引名称。

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

【讨论】:

    【解决方案3】:

    我不确定是否有外键 会隐含索引吗?

    “InnoDB 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描……如果引用表不存在,则会在引用表上自动创建这样的索引。” (Source)

    因此KEY parent_idx (parent) 是多余的。

    另一方面请注意,如果您要使用 ALTER TABLE 语法添加外键约束,则必须先显式创建所需的索引。

    【讨论】:

    • 您看不到另一个索引,因为如果您已经明确创建了一个外键,InnoDB 将不会为外键创建新索引。如果您不创建parent_idx,InnoDB 将为您创建它(使用不同的名称)。
    猜你喜欢
    • 2021-08-02
    • 2021-01-08
    • 2018-03-10
    • 2013-08-07
    • 1970-01-01
    • 2011-09-22
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多