这里的“父母”索引是否必要?

时间:2010-02-23 13:19:23

标签: mysql foreign-keys indexing

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)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

是的,你是对的。

KEY parent_idx ()是冗余索引。

MySQL会自动为FOREIGN KEY约束创建一个索引。

来自MySQL手册:

  

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

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

答案 2 :(得分:0)

  

我不确定是否是外键   会暗示一个指数吗?

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

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

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