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)