2017-02-16 106 views
-1

我有表球员部族clanmembers玩家连接到氏族。我想要做的就是要求所有玩家拥有战队信息,不管他们是否有战队,并按玩家排序。排名(索引)。MySQL使用文件排序,并导致性能下降

SELECT * FROM球员LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN部族ON clanmembers.clan = clans.id ORDER BY 排名DESC LIMIT 0,100;

上面的查询正常工作,但由于某种原因,它扫描整个玩家表(很多行),查询速度很慢。如果我选择玩家*,而不是性能突增,只有100行被检查,而不是所有玩家。

我在做什么错在这里?我不明白为什么添加战队东西选择使查询扫描整个球员表时,连接保持完全一样。

编辑:All indexes here.

编辑2:Query results (EXPLAIN) here

+0

请添加两个查询的解释,并列出对2个表和它们包含的字段索引的结果。 – Shadow

+0

已添加到原始帖子。由于Javi的回答,添加了id_rank,但没有奏效。 –

回答

1

好像加入FORCE INDEX(秩)修复该问题。

又老又慢:

SELECT * FROM players LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN clans ON clanmembers.clan = clans.id ORDER BY rank DESC LIMIT 0,100; 

新和快:

SELECT * FROM players FORCE INDEX (rank) LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN clans ON clanmembers.clan = clans.id ORDER BY rank DESC LIMIT 0,100 
1

当你在订购前加入player表与其他表(因此由player id过滤),也许你必须添加player id到索引中。事情是这样的:

CREATE INDEX index_name ON players (rank, id); 

和可选,如果你总是订购降序排列,这样的事情:

CREATE INDEX index_name ON players (rank DESC, id); 
+0

players.id已经是我的表中的每个id列的主键。我应该将id添加到等级索引还是创建具有两列(id和等级)的全新索引?这对性能有任何负面影响吗? –

+0

为什么玩家在订购前用id过滤?如果你运行一个查询返回所有想要的玩家,正确排序,然后只查找每行的其他表,那么这样做会更有意义吗? –

+0

带有这两个字段的额外索引会降低修改查询的性能,但会改进选择查询。在这个索引里面,每个用户都按降序排序,并且还包含id,所以它不必查看整个表格。 –

相关问题