MySQL 查询性能

MySQL query perfomance

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 的所有行。这 2 个查询在性能方面是否相等?

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.

专业提示:不要以假设下一位程序员记住运算符优先规则的方式编写代码。下一个程序员可能就是你未来的自己。括号有助于清晰度并且不会影响性能。在你的例子中,写

  WHERE (TournamentID=@tid AND PlayerID1=@player_id) 
     OR (TournamentID=@tid AND PlayerID2=@player_id)

尽管它和你写的意思一样。但是你的第二个表述也很清楚。