MySQL查询性能

问题描述 投票:0回答:1
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 query-performance
1个回答
1
投票

您具有正确的复合索引,其中任一查询的列均以正确的顺序排列。

[MySQL查询规划器似乎可以对任何一个以相同的方式工作,依次对每个索引进行索引扫描。但是要确定要使用EXPLAIN

Pro tip:不要以假定下一个程序员记住运算符优先级规则的方式编写代码。下一位程序员可能是您未来的自我。括号有助于清晰度,并且不会影响性能。在您的示例中,写

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

即使它与您编写的内容含义相同。但是您的第二种说法也很清楚。

© www.soinside.com 2019 - 2024. All rights reserved.