普通键是否应包含主键?

3

这个问题涉及到MySQL表需要有ID吗?

对于一个表而言,有一个无意义的自增ID作为主键,那么当我创建其他键时,是否应该在这些键中包含此ID?

例如,在这个表中:

CREATE TABLE `location` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `country` varchar(50),
  `states`  varchar(50),
  `city`    varchar(50),
  `county`  varchar(50),
  `zip`     int(5),
  PRIMARY KEY(ID),
  KEY zip1 (zip),
  KEY zip2 (zip, ID)
} ENGINE=InnoDB ;

因为我经常需要使用邮政编码来搜索表格,所以我需要一个以邮政编码开头的KEY。我应该使用KEY zip1还是KEY zip2?这两个KEY中哪一个更好?
1个回答

11

对于InnoDB,主键始终包含在次要索引中

除聚集索引外,所有索引均称为次要索引。 在InnoDB中,每个次要索引记录都包含行的主键列,以及指定的次要索引列。 InnoDB使用此主键值在聚集索引中搜索行。

换句话说,ID已经包含在zip1中,因此不需要在zip2中提及。


谢谢。官方文档非常有帮助。 - Ben Lin
8
有一定道理。我可以补充说明,尽管聚簇键(在本例中为“id”)包含在InnoDB中的每个辅助键中,但MySQL本身并不知道这一点。在某些情况下,包括聚簇键列(或其子集)将有助于优化器的决策。例如,如果您有“SELECT id FROM t WHERE a=5 ORDER BY id DESC”,您可以通过在“(a,id)”上创建索引来避免额外的排序。此外,在索引定义中包括聚簇键不会占用额外的空间,因为列数据已经存在那里了。 - jeremycole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接