【问题标题】:Should I add multiple indexes?我应该添加多个索引吗?
【发布时间】:2012-10-30 16:05:13
【问题描述】:

如果我有一个包含 2 个字段的表的唯一索引,我应该在每个字段上添加另一个索引吗?

示例:

我的桌子是这样的:

CREATE TABLE IF NOT EXISTS `my_table` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `usersID` int(11) NOT NULL,
  `userTypesID` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

然后我添加一个涵盖usersIDuserTypesID 的唯一索引:

ALTER TABLE  `my_table` ADD UNIQUE  `usersID_userTypesID` (  `usersID` ,  `userTypesID` )

值得我再添加 2 个索引,一个在 usersID,另一个在 userTypesID 例如:

ALTER TABLE  `my_table` ADD INDEX (  `usersID` )
ALTER TABLE  `my_table` ADD INDEX (  `userTypesID` )

添加这些额外的索引会加速某些查询吗?例如:

SELECT      `usersID`
FROM        `my_table`
WHERE       `userTypesID` = 101

或者

SELECT      `usersTypesID`
FROM        `my_table`
WHERE       `usersID` = 29

【问题讨论】:

    标签: mysql indexing database-indexes


    【解决方案1】:

    In theory(usersID, userTypesID) 上的索引本身也将充当usersID 上的索引,因为它是最左边的列。

    您也将从userTypesID 上的索引中受益。

    【讨论】:

      【解决方案2】:

      您不需要额外的索引,see here。 也试试 SHOW INDEXES FROM my_table

      【讨论】:

      • +1,感谢您的参考问题,它确认 Alnitaks 的答案是正确的,因为如答案中所述,mysql 可以使用最左边的索引。
      • @Gerve 我的答案中的链接(可能不是很明显)也谈到了使用最左边的列。我在回答中说“理论上”,因为我见过仅一列上的索引比两列上的索引效果更好的情况。
      • 我建议尝试 EXPLAIN SELECT .. WHERE usersID=1 EXPLAIN SELECT .. WHERE userTypesID=1 ,反之亦然,您将看到何时使用索引,何时不使用。是的,Alnitak 的链接解释了它是如何工作的。
      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2011-12-22
      • 2017-03-19
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      相关资源
      最近更新 更多