1

你好 Stackoverflow 社区,

这是我在这里的第一篇文章,所以我为我糟糕的英语道歉!:)

如果您不想阅读所有内容,则问题标记如下

标题有点误导,但我不知道如何更好地解释它,但详细的解释应该让你明白:

我有一个很大的日志表(此时大约有 500000 行),其中一个游戏服务器记录了游戏中发生的许多动作。我想以最有效的方式提取一些特定的日志行。

我无法更改游戏服务器的日志系统,如果可以的话,我会将其更改为更多的日志表,以创建更紧凑的日志。(因为在该表上执行查询需要时间..)

现在我的问题是,我想获取特定类型的最后一个日志行,并从特定的玩家 ID 获取玩家的最后操作,但我不知道如何以有效的方式做到这一点。例子:

SELECT * FROM log WHERE logType = "PLAYER" AND playerID = [playerID] ORDER BY time DESC LIMIT 1

然后网站上的输出将是:您最后的操作是[人类可读的操作和附加信息]。

MySQL 分析现在告诉我,对结果进行排序需要最多的时间。

现在我的问题是:是否可以只获取特定玩家 ID 和类型的最后一行? 我想这可以用 ID 完成,因为它有 auto_increment。那么是否有可能获得具有最高 ID、特定类型和特定玩家 id 的行?

表结构:ID(int) | 日志类型(varchar) | 时间(日期时间) | 玩家ID(int) | 位置X(int) | 位置Y(int) | 动作ID(int) | 动作(varchar) | 提示(varchar) | ip(varchar) | 项目编号(整数)

解释:

ID:记录操作的唯一 ID

logType:记录动作的类型(例如:“PLAYER”或“ITEM”)

time:动作发生的时间

playerID:玩家的 id(或与该类型相关的其他 id)

positionX:游戏中的X位置

positionY:游戏中的Y位置

actionID:与动作相关的 id(例如:如果日志动作是“KILLED_BY_PLAYER”,则为杀死该玩家的其他玩家的玩家 id)

action:记录的动作(例如:KILLED_BY_PLAYER)

提示:一些有用的提示,比如玩家的名字

ip:播放器的IP

itemNumber:Item的编号,如果涉及到Item,否则为NULL

谢谢你的帮助。:)

4

2 回答 2

1

获得最高的 id:

select max(id) from table;

其他您可以在 select 语句中放置 where 子句。

于 2013-04-03T14:17:40.757 回答
0

time您应该能够在排序的地方使用您的查询LIMIT 1。如果您对列的排序time很慢,则必须确保索引已优化(explain在您的查询上运行)。您将需要和上logtype的索引。即使有 500 000 行,这不应该是一个问题......player_idtime

于 2013-04-03T14:21:34.583 回答