我对这个表的最佳索引选项感到有点困惑。我想要搜索和加入ServiceID和TagID。我还需要确保两者结合是独一无二的。
CREATE TABLE IF NOT EXISTS `service-tag` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ServiceID` int(10) unsigned NOT NULL,
`TagID` int(10) unsigned NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `ServiceID` (`ServiceID`,`TagID`),
KEY `TagID` (`TagID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=39 ;
是否需要在TagID上添加第二个索引,还是自动从UNIQUE索引中的第二列开始正确索引?
答案 0 :(得分:1)
如果你有一个多列索引(作为ServiceID
索引IS),那么当你只搜索TagID
时,MySQL就无法使用该索引。在非专业语言中,当您只需要ServiceID
时,MySQL无法使用TagID
“覆盖”到索引中。
因此,如果你只计划在语句中使用TagID
而不是想要保留该索引。
如果您从未计划仅查询TagID
,并且所有查询都将同时使用ServiceID
和TagID
,那么是,TagID
- 唯一索引是不需要。
手册中记录了此行为:
https://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上建立索引搜索功能。
如果列不形成索引的最左前缀,则MySQL无法使用索引执行查找。