You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:07:11