我有表格players
,players_to_teams
和accounts
。 players_to_teams
的FK为players
和accounts
。 players
有FirstName
,accounts
有Name
。 FirstName
和Name
都已编入索引。
正在运行
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
这些查询不应该在类似的时间空间中执行吗?
答案 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。