为什么这两个(类似的?)MySQL查询的执行时间变化如此之大?

时间:2012-04-12 16:51:28

标签: mysql select indexing

我有表格playersplayers_to_teamsaccountsplayers_to_teams的FK为playersaccountsplayersFirstNameaccountsNameFirstNameName都已编入索引。

正在运行

SELECT players_to_teams.id
FROM players_to_teams
INNER JOIN players
ON players.id = players_to_teams.player_id
ORDER BY players.FirstName

在0.004秒内执行。

SELECT players_to_teams.id
FROM players_to_teams
INNER JOIN accounts
ON accounts.id = players_to_teams.account_id
ORDER BY accounts.Name

在7秒内执行。

有30,000个账号记录和25万个玩家记录。

EXPLAIN可在此处找到:https://gist.github.com/2368906

这些查询不应该在类似的时间空间中执行吗?

2 个答案:

答案 0 :(得分:1)

另一个可能有帮助的选项......我记得在某个地方读过...如果你的帐号ID和Name都有一个索引作为单个索引(id,name),那么引擎就不必去了返回原始数据记录以提取名称值,并可以直接从索引中提取...从而节省了对匹配的完整记录读取的时间。

答案 1 :(得分:1)

您的较慢查询需要一个临时表来对结果集进行排序,而另一个查询可以使用FirstName上的索引,从而避免一起排序。 (额外:使用索引;使用临时;使用filesort)

您是否可以尝试强制使用帐户上的索引来查看是否可以超越优化?

SELECT players_to_teams.id
FROM players_to_teams 
INNER JOIN accounts FORCE INDEX(Name)
ON accounts.id = players_to_teams.account_id
ORDER BY accounts.Name

另一种选择是使用直接连接重写查询,并首先列出帐户表。

我没有任何好的答案,为什么当帐户的行数减少时,它首先选择player_to_teams。