CREATE TABLE IF NOT EXISTS `Tournaments` (
`TournamentID` INT,
`PlayerID1` BIGINT,
`PlayerID2` BIGINT,
PRIMARY KEY (`TournamentID`),
INDEX `world_t_p1` (`TournamentID` ASC, `Player1` ASC),
INDEX `world_t_p2` (`TournamentID` ASC, `Player2` ASC));
我想使用索引在所有行中查询一个特定的PlayerID。在性能方面,这两个查询是否相等?
select * from Tournaments
where TournamentID=@tid and PlayerID1=@player_id OR TournamentID=@tid and PlayerID2=@player_id;
select * from Tournaments
where TournamentID=@tid and (PlayerID1=@player_id OR PlayerID2=@player_id);
您具有正确的复合索引,其中任一查询的列均以正确的顺序排列。
[MySQL查询规划器似乎可以对任何一个以相同的方式工作,依次对每个索引进行索引扫描。但是要确定要使用EXPLAIN
。
Pro tip:不要以假定下一个程序员记住运算符优先级规则的方式编写代码。下一位程序员可能是您未来的自我。括号有助于清晰度,并且不会影响性能。在您的示例中,写
WHERE (TournamentID=@tid AND PlayerID1=@player_id)
OR (TournamentID=@tid AND PlayerID2=@player_id)
即使它与您编写的内容含义相同。但是您的第二种说法也很清楚。