普通密钥是否应包含主密钥?

Ben*_*Lin 1 mysql indexing innodb

这个问题与 MySQL表需要一个ID有关吗?

有一个无意义的auto_incremental ID作为表的PRIMARY KEY,然后当我创建其他KEY时,我应该在KEY中包含这个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 ;
Run Code Online (Sandbox Code Playgroud)

因为我需要使用邮政编码搜索表格,所以我需要一个从邮政编码开始的KEY.我应该使用KEY zip1或KEY zip2.这两个KEY中哪一个更好?

Joa*_*son 6

对于InnoDB,主键始终包含在二级索引中 ;

除聚簇索引之外的所有索引都称为辅助索引.在InnoDB中,辅助索引中的每条记录都包含该行的主键列以及为辅助索引指定的列.InnoDB使用此主键值来搜索聚簇索引中的行.

换句话说,ID已经包含在内zip1,并且不必像它一样被提及zip2.

  • 这有点真实.我可以补充一点,尽管集群密钥(在这种情况下为`id`)包含在InnoDB*中的每个二级密钥*中,但MySQL本身并不知道这一点.在某些情况下,包含聚簇键列(或其子集)将改进优化器的决策制定.例如,如果你有`SELECT id FROM t WHERE a = 5 ORDER BY id DESC`,你可以通过在`(a,id)`上建立索引来避免额外的排序.此外,在索引定义中包含簇密钥不会占用任何额外空间,因为列数据已经存在. (4认同)