2014-02-24 47 views
1

这个问题是关系到 Do MySQL tables need an ID?正常密钥应包含主键吗?

有一种毫无意义的auto_incremental 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 zip1或KEY zip2。这两个KEY中的哪一个更好?

回答

5

对于InnoDB,the primary key is always included in secondary indexes;

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

换句话说,ID已经包含在zip1,并没有被提及,因为它是在zip2

+0

谢谢。官方文件非常有帮助。 –

+2

这是真的。我可以补充一点,虽然InnoDB *中的每个辅助键*都包含聚簇键(本例中为“id”),但MySQL本身并不知道这一点。在某些情况下,包括聚集键列(或其子集)将改进优化器的决策制定。例如,如果你有'SELECT id FROM t WHERE a = 5 ORDER BY id DESC',你可以通过在'(a,id)'上建立索引来避免额外的排序。此外,在索引定义中包含集群键不会占用额外的空间,因为列数据已经存在。 – jeremycole