2017-02-16 45 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,所以它不必查看整個表格。 –

相關問題