MySQL中普通KEY(非PK、FK)的作用是什么?附关联表SQL代码
MySQL中普通KEY(非PK、FK)的作用详解
嘿,我来给你拆解下MySQL里普通KEY的核心作用,结合你给出的Genre_Movie关联表例子会更直观~
核心作用
- 大幅提升查询效率:普通KEY本质就是普通索引,它能让数据库跳过全表扫描,直接通过索引结构快速定位目标数据。比如你提供的表中,主键是
(id_movie, id_genre)的联合索引,这个索引能优化「按电影ID查对应类型」的查询,但如果业务需要「按类型ID查所有关联电影」(比如“找出所有喜剧片的ID”),单独的KEY id_genre (id_genre)就会发挥作用——数据库可以直接通过这个索引快速匹配到所有该类型的记录,不用遍历整张表。 - 辅助外键约束的性能优化:外键本身是用来维护数据一致性的约束,但在执行外键关联检查(比如删除
Genre表中某条类型记录时,需要确认Genre_Movie里有没有关联数据)时,普通索引能让这个检查过程更快。就像例子里的id_genre外键,搭配对应的普通KEY后,数据库不用全表扫描就能完成关联校验,减少操作耗时。 - 降低系统资源消耗:没有索引的全表扫描会占用大量CPU、IO资源,数据量越大越明显。普通索引能将查询的时间复杂度从O(n)降到O(log n),在大数据量场景下,能显著减少服务器的资源压力。
结合你提供的SQL示例
下面是补全后的完整建表语句:
DROP TABLE IF EXISTS `Genre_Movie`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Genre_Movie` ( `id_genre` int(11) NOT NULL DEFAULT '0', `id_movie` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id_movie`,`id_genre`), KEY `id_genre` (`id_genre`), CONSTRAINT `Genre_Movie_ibfk_1` FOREIGN KEY (`id_movie`) REFERENCES `Movie` (`id_movie`), CONSTRAINT `Genre_Movie_ibfk_2` FOREIGN KEY (`id_genre`) REFERENCES `Genre` (`id_genre`) );
这里的KEY id_genre (id_genre)就是典型的普通KEY:因为联合主键(id_movie, id_genre)的索引生效规则是「前缀匹配」,只查id_genre的话联合索引没法用,单独建这个普通KEY正好补上了这个查询场景的性能短板,同时也优化了外键的关联检查效率。
内容的提问来源于stack exchange,提问作者theMaximumForce
相关产品推荐
相关产品推荐

