MySQL多个连接速度很慢

时间:2013-11-19 18:36:01

标签: mysql sql join

我有一张包含以下结构的表格:

db structure

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

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

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

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

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

我担心某些内容会对性能产生很大影响,因为它可以在没有任何JOIN语句的情况下正常工作。 任何人都可以对此有所了解吗?

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

编辑2:对静态版本进行分析(在localhost上)给了我这张照片:

db profile

EXPLAIN的输出:

db explain

1 个答案:

答案 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