我们正在运行一系列游戏的统计网站,但在日志超过100兆之后,事情开始变慢,所以我们需要优化我们的查询。
然而,我们发现我们认为是一个简单的查询,大约需要1.5秒:
SELECT handle,
(
SELECT COUNT(*)
FROM kills
WHERE killer=p.handle
AND k_team != c_team
AND gid=p.gid
) AS kills
FROM players as p
WHERE gid="3245"
AND team="axis"
ORDER BY kills DESC LIMIT 0, 10;这将为其中一个团队生成一个结果列表。
桌杀和玩家分别由36000行和4000行组成。
为什么查询花了这么长时间,如何对其进行优化?我们是不是应该研究一下JOIN?
致以最好的问候,拉卡
发布于 2009-04-18 17:42:52
您是否尝试过在kills表的killer列上建立索引?
编辑索引上的信息。http://www.w3schools.com/Sql/sql_create_index.asp
发布于 2009-04-18 17:44:10
是的,你绝对应该研究一下joins。很难从您发布的代码片段中辨别出来,但无论何时可以对子查询使用连接,这样做都是有益的。
您可能还想考虑在数据库中的其他地方缓存kill count;特别是如果您正在使用InnoDB,SELECTing ()操作比简单地从数据库中缓存一个相对较新的值要花费更多的时间。您可能可以通过在适当的记录上递增kill count或类似的东西,在代码中轻松地实现这一点。
发布于 2009-04-18 17:46:00
尝试:
SELECT handle, count(*) as kills
FROM players as p
JOIN Kills as k ON k.gid = p.gid
WHERE gid="3245"
AND team="axis"
ORDER BY kills DESC LIMIT 0, 10;https://stackoverflow.com/questions/763815
复制相似问题