2

我有表playersplayers_to_teamsaccounts。 对和players_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 个帐户记录和 250,000 个玩家记录。

EXPLAIN可以在这里找到:https ://gist.github.com/2368906

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

4

2 回答 2

1

另一个可能有帮助的选项...我记得在某处读过...如果您在帐户 ID 和名称上都有一个索引作为单个索引(id,名称),那么引擎不必回到原始数据记录来提取名称值并可以直接从索引中提取它......从而节省了从匹配项上读取完整记录的时间。

于 2012-04-12T17:02:18.260 回答
1

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

您可以尝试强制对帐户进行索引,看看您是否可以超越优化的?

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,我没有任何好的答案。

于 2012-04-12T17:55:11.070 回答