我有3个独立的查询,当我通过左联接合并它们时,性能下降很大
关于为什么会发生或如何解决此问题的任何想法?
这里查询
第一个查询
SELECT MONEY,
AccountLevel,
BadgeCount,
EloWin,
TournamentOfficBattleTotal,
MaximumTowerLevel,
NpcBattleVictoryCount
FROM table_2
WHERE table_2.UserId = 465903
第二查询
SELECT COUNT(DISTINCT table_1.PokemonId) AS PokedexOwnage
FROM table_1 WHERE UserId = 465903
第三查询
SELECT COUNT(*) AS PokedexEvent
FROM table_3 WHERE UserId = 465903
这里是将所有3个合并为一个的解决方案
SELECT MONEY,
AccountLevel,
BadgeCount,
COUNT(DISTINCT table_1.PokemonId) AS PokedexOwnage,
COUNT(DISTINCT table_3.PokemonId) AS PokedexEvent,
EloWin,
TournamentOfficBattleTotal,
MaximumTowerLevel,
NpcBattleVictoryCount
FROM table_2
LEFT JOIN table_1 ON table_1.UserId = table_2.UserId
LEFT JOIN table_3 ON table_3.UserId = table_2.UserId
WHERE table_2.UserId = 465903
GROUP BY AccountLevel,
BadgeCount,
EloWin,
TournamentOfficBattleTotal,
MaximumTowerLevel,
NpcBattleVictoryCount,
MONEY
当我通过执行计划进行比较时,前3个查询相对于最后一个查询花费0%的相对成本
总计之前加入。一种方法是使用相关子查询:
SELECT MONEY, AccountLevel, BadgeCount, EloWin,
TournamentOfficBattleTotal, MaximumTowerLevel, NpcBattleVictoryCount,
(SELECT COUNT(DISTINCT t1.PokemonId)
FROM table_1 t1
WHERE t1.UserId = t2.UserId
) as PokedexOwnage,
(SELECT COUNT(*)
FROM table_3 t3
WHERE t1.UserId = t3.UserId
) as PokedexEvent
FROM table_2 t2
WHERE t2.UserId = 465903;
这可能很好。但是为了获得更好的性能,请确保在table_2(UserId, PokemonId)
和table_3(UserId)
上都有索引。