Hello 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)| logType(varchar)|时间(日期时间)| playerID(int)| positionX(int)| positionY(int)| actionID(int)| action(varchar)|提示(varchar)| ip(varchar)| itemNumber(INT)
阐释:
ID:已记录操作的唯一ID
logType:已记录操作的类型(示例:“PLAYER”或“ITEM”)
时间:动作发生的时间
playerID:播放器的ID(或与该类型相关的其他ID)
positionX:游戏中的X位置
positionY:游戏中的Y位置
actionID:与动作相关的ID(示例:如果日志操作为“KILLED_BY_PLAYER”,则为杀死玩家的其他玩家的玩家ID)
操作:记录的操作(示例:KILLED_BY_PLAYER)
提示:一些有用的提示,如播放器的名称
ip:播放器的IP
itemNumber:Item的编号,如果涉及Item,则为NULL
感谢您的帮助。 :)
答案 0 :(得分:1)
获得最高ID:
select max(id) from table;
您可以在select语句中放置where子句的其他人。
答案 1 :(得分:0)
您应该可以使用time
与LIMIT 1
对您进行排序的查询。如果对列time
的排序很慢,则必须确保索引已优化(对查询运行explain
)。您需要logtype
,player_id
和time
上的索引。即使有50万行,这也不应该是一个问题......