正常的键(Key)是否应包括主键(primary key)?

21 浏览
0 Comments

正常的键(Key)是否应包括主键(primary key)?

这个问题与MySQL表需要一个ID吗?有关。表中有一个无意义的自增ID作为主键,那么当我创建其他键时,是否应该在键中包含这个ID呢?例如,在这个表中,因为我需要经常使用邮政编码来搜索表,所以我需要一个以邮政编码开头的键。我应该使用KEY zip1还是KEY zip2?这两个键中哪一个更好?

0
0 Comments

在InnoDB中,每个辅助索引中的记录都包含了主键列以及辅助索引指定的列。InnoDB使用主键值来在聚簇索引中搜索行。因此,在辅助索引中不需要再次提及主键。

然而,MySQL本身并不知道主键已经包含在辅助索引中。在某些情况下,包含聚簇键列(或其中的一部分)可以改善优化器的决策。例如,如果有一个查询语句SELECT id FROM t WHERE a=5 ORDER BY id DESC,通过在索引上包含(a, id)可以避免额外的排序操作。此外,将聚簇键包含在索引定义中并不会占用额外的空间,因为该列的数据已经存在。

因此,当使用InnoDB引擎时,不需要在辅助索引中再次包含主键列。这样可以避免冗余数据存储,并且有助于优化查询性能。

解决方法是在创建辅助索引时,只指定辅助索引需要的列,不包含主键列。这样可以避免冗余数据存储,并且可以根据具体情况优化索引设计,提高查询性能。

0