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)
尽管它和你写的意思一样。但是你的第二个表述也很清楚。
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)
尽管它和你写的意思一样。但是你的第二个表述也很清楚。