MySQL多个连接速度很慢

ski*_*iwi 1 mysql sql join

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

数据库结构

我的所有主键都是正确的,每个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;

我自己的机器上的性能,它有很多资源:

  • 查询#1:0.0016秒
  • 查询#2:1.3050秒

实时数据库主机上的性能,它具有相当少的资源:

  • 查询#1:0.046秒
  • 查询#2:1.297秒

我担心某些事情会对性能产生很大的影响,因为它没有任何JOIN声明就可以正常工作.任何人都可以对此有所了解吗?

ps(编辑).添加也可能很重要:此数据库每隔几秒就会进行实时更新,因此查询结果的缓存方式与静态数据查询的结果相同.

编辑2:静态版本(on localhost)上的分析给了我这样的图片:

db profile

产量EXPLAIN:

db解释

Mik*_*ant 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
Run Code Online (Sandbox Code Playgroud)