2013-04-03 63 views
1

你好社区#1的最高ID,的MySQL只获得该行与查询

这是我的第一篇文章在这里,所以我对我的英语不好道歉! :)

如果你不想读的一切,存在的问题都标这样

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

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

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

现在我的问题是,我想从一个特定的玩家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时间:在X位置:玩家(或与该类型其他的id)

位X的ID游戏

位置▲:在游戏

actionID Y位置:在关系的ID的动作(例如:如果日志操作是“KILLED_BY_PLAYER”,那么是谁杀了玩家的其他玩家的玩家ID)

行动:所记录的动作(例如:KILLED_BY_PLAYER)

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

IP的名称:玩家的IP

itemNumber:项目的编号,如果涉及某个项目,则返回NULL

感谢您的帮助。 :)

+0

,那么你就应该能够通过ID递减命令,限制1. – sbeliv01

+0

这是一点点比随着时间排序更快,谢谢! –

回答

1

,以获得最高ID:

select max(id) from table; 

别人,你可以把一个where子句中的select语句。

+0

这会得到正确的'ID',但不幸的是,其他字段不是来自具有该ID的行。但如果我使用2个查询,它的运行速度会更快,所以谢谢!编辑:我的意思是用2个查询:'SELECT * FROM log WHERE ID =(SELECT MAX(ID)FROM log WHERE logType =“PLAYER”AND playerID = [playerID]);' –

0

您应该能够使用您查询您在其中的timeLIMIT 1。如果您对列time的排序较慢,则必须确保索引已优化(在您的查询上运行explain)。您需要在logtype,player_idtime上都有索引。即使有50万行如果表是通过自动递增ID下令这不应该是一个问题...

+0

这不是一个真正的问题,它只需要像1到5秒。但我想知道我是否可以跳过排序。我想到了只能得到**这个最高ID的行,它与'logType'和'playerID'等特定事物相匹配。但没关系,如果没有分类就没有可能。 :) –

+0

好吧,你需要通过'SORT'或'MAX'排序。无论哪种方式,我都希望查询的执行时间少于一秒钟。当我在其中一个包含160万行的表中运行一个类似的查询时,它会在4.1 ms内执行......如果执行时间是1-5秒,那么肯定是错的!也许你可以在查询中发布'EXPLAIN'的输出? – darwin

+0

'1 | SIMPLE |日志| index | playerID,logType |时间| 9 | NULL | 2 |使用where' 这就是使用查询'EXPLAIN SELECT * FROM log WHERE logType =“PLAYER”和playerID = 1 ORDER BY time DESC LIMIT 1'的输出,我希望你能阅读它,因为我不能把标题正确地在这个评论中:/ –