我有以下查询:
SELECT result.globalId AS id, result.date, p1.playerName AS player, p2.playerName AS target, w.weaponIngameName AS weapon, result.headshot, s.serverName AS server, result.origin
FROM ((SELECT globalId, date, serverId, playerId, targetId, weaponId, headshot, 'playerkills' AS origin
FROM playerkills
ORDER BY date DESC)
UNION
(SELECT globalId, date, serverId, playerId, null, null, null, 'playersuicides' AS origin
FROM playersuicides
ORDER BY date DESC) ORDER BY date DESC LIMIT 300) result
LEFT JOIN players p1 ON result.playerId = p1.playerId
LEFT JOIN players p2 ON result.targetId = p2.playerId
LEFT JOIN weapons w ON result.weaponId = w.weaponId
LEFT JOIN servers s ON result.serverId = s.serverId
ORDER BY result.date DESC, result.globalId DESC;
计算需要很长时间,这是不必要的,我找到了原因:UNION
将表放在内存中以便执行LIMIT
,如果我放{{1}在个人查询中,一切都很好。
我如何修复它以便尽快执行此(某种)查询?显然我不能LIMIT
两个LIMIT
- 查询内部SELECT
因为我不知道300个结果中有多少来自任何一个。
在分析时,它显示99%的执行时间是由于查询中间的这个序列:发送数据+将HEAP转换为MySIAM +发送数据。
编辑:其他信息
我的帖子开头显示的原始查询平均需要4~6秒才能执行。
当我将UNION
放在原始查询中时,分别按LIMIT
上的295和playerkills
上的5,查询将在50毫秒内执行。
答案 0 :(得分:2)
限制每个表中的300行,将它们联合起来并限制最后300行。这样你肯定不会错过任何行。
答案 1 :(得分:2)
使用UNION ALL
代替UNION
。 UNION
过滤重复项,因此需要更多时间。这是不必要的,因为这个查询似乎永远不会返回任何重复。
我不知道查询的速度会有多快,但也许您可以将其与其他答案结合起来。