Mysql 此处是否需要“parent”上的索引?

Mysql 此处是否需要“parent”上的索引?,mysql,foreign-keys,indexing,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`),

我不确定外键是否意味着索引

编辑

我看不到假定的索引:

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

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

是的,您是正确的

parent\u idx
parent
是冗余索引

MySQL将自动为外键约束创建索引

从MySQL手册:

InnoDB为数据库创建索引 外键,它使用索引名称 索引名

我不确定是否有外键 这将意味着一个索引

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

因此,
键父项\u idx(父项)
是冗余的


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

否,InnoDB会自动创建索引:“InnoDB需要外键和引用键的索引,以便外键检查可以快速进行,而不需要表扫描。。。如果引用表不存在,则会自动在引用表上创建这样的索引。“来源:。SQL Server不会自动在外键上创建索引。我想我只是假设它们在这方面是相同的。FWIW,我认为SQL Server的行为更好,因为它提供了更多的控制。@user198729:您没有看到其他索引,因为如果您已经显式创建了外键,InnoDB将不会为外键创建新索引。如果不创建
parent\u idx
,InnoDB将为您创建一个索引(使用不同的名称)。您看不到其他索引,因为如果您已经明确创建了索引,InnoDB将不会为外键创建新索引。如果您不创建
parent\u idx
,InnoDB将为您创建它(使用不同的名称)。
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)