我有一个具有以下结构的表:

我的所有主键都是正确的,每个int和date列都有一个索引,而(playerId, groupId)in 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:静态版本(on localhost)上的分析给了我这样的图片:

产量EXPLAIN:

这是子选择可能有助于您的事业的情况之一.而不是将所有这些表加入完整的玩家技能表,你可以选择最后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
Run Code Online (Sandbox Code Playgroud)