我们在MySQL中有下面的表。
CREATE TABLE `user_team` (
`user_id` int(11) NOT NULL,
`team_id` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`,`team_id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;这里需要KEY user_id (user_id)吗?我记得在某处读到过这样一句话:复合索引的第一列自动具有索引。似乎找不到来源。
发布于 2021-04-09 09:48:38
从MySQL documentation
如果表具有多列索引,则优化器可以使用索引最左侧的任何前缀来查找行。
使用示例索引(user_id, team_id),只对user_id进行查询过滤的查询可以使用此索引,因为B树首先在此字段上建立索引。它随后也按team_id拆分并不重要,因为您只查找与某个或多个user_id值匹配或不匹配的所有记录。
现在,如果您还想支持仅在team_id上过滤的查询,那么您至少需要添加一个其他索引。在这种情况下,您当前的复合索引将不会涵盖这种类型的查询。
发布于 2021-04-09 09:46:24
KEY (user_id)对于主键来说是完全多余的。主键还创建了一个索引。包含多列的复合索引也是每个前导列序列的索引。因此,(a, b, c)上的索引也是(a)和(a, b)上的索引。
MySQL文档实际上对多列索引有很好的解释。你可能想看看it。
https://stackoverflow.com/questions/67013964
复制相似问题