我有一张包含以下结构的表格:
我的所有主键都是正确的,每个int& date列有一个索引,(playerId, groupId)
中的player_groups
是唯一索引。所有表都使用InnoDB,您看到的关系也是InnoDB中的引用。
包含数据的完整数据库源,与我将在下面演示的示例大致相似:https://www.dropbox.com/s/kzf89occlq4legy/bf4_performance.sql
查询:
查询#1:SELECT * FROM playerkills ORDER BY date DESC LIMIT 300;
查询#2:SELECT p.playerName AS player, p2.playerName AS target, w.weaponName AS weapon, date, headshot, s.serverName AS server FROM playerkills JOIN players p ON playerkills.playerId = p.playerId JOIN players p2 ON playerkills.targetId = p2.playerId JOIN weapons w ON playerkills.weaponId = w.weaponId JOIN servers s ON playerkills.serverId = s.serverId ORDER BY date DESC LIMIT 300;
我自己的机器上的性能,它有很多资源:
实时数据库主机上的性能,它具有相当少的资源:
我担心某些内容会对性能产生很大影响,因为它可以在没有任何JOIN
语句的情况下正常工作。
任何人都可以对此有所了解吗?
ps(编辑)。添加也可能很重要:此数据库每隔几秒就会进行实时更新,因此查询结果的缓存方式与静态数据查询的结果相同。
编辑2:对静态版本进行分析(在localhost
上)给了我这张照片:
EXPLAIN
的输出:
答案 0 :(得分:5)
这是其中一个子选择可能有助于您的事业的情况之一。而不是将所有这些表加入完整的玩家技能表,你可以选择最后300个玩家杀死然后根据它加入。如下所示:
SELECT
p.playerName AS player,
p2.playerName AS target,
w.weaponName AS weapon,
pk.date AS date,
pk.headshot AS headshot,
s.serverName AS server
FROM
(SELECT * FROM playkills ORDER BY date DESC LIMIT 300) AS pk
JOIN players p
ON pk.playerId = p.playerId
JOIN players p2
ON pk.targetId = p2.playerId
JOIN weapons w
ON pk.weaponId = w.weaponId
JOIN servers s
ON pk.serverId = s.serverId