我有表格玩家,部落和部落,它们将玩家连接到部落。我想要做的是向所有玩家提供有关部族信息的信息,无论他们是否有战队,并按玩家排序。(以索引为主)。
SELECT * FROM players LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN clans ON clanmembers.clan = clans.id ORDER BY 排名DESC LIMIT 0,100;
上面的查询工作正常,但由于某种原因它会扫描整个播放器表(很多行),查询速度很慢。如果我选择玩家。*而不是性能冲击,只检查100行而不是所有玩家。
我在这里做错了什么?我不明白为什么在联接保持完全相同的情况下添加部落内容以使查询扫描整个玩家表格。
答案 0 :(得分:1)
当你在订购之前将player id
表加入其他表(因此按player id
过滤)时,可能必须将CREATE INDEX index_name ON players (rank, id);
添加到索引中。像这样:
CREATE INDEX index_name ON players (rank DESC, id);
并且可选地,如果您总是按降序排序,可以这样:
fileprivate var player1:AVAudioPlayer?
fileprivate var player2:AVAudioPlayer?
fileprivate var player3:AVAudioPlayer?
答案 1 :(得分: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