2013-04-03 62 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'的輸出,我希望你能閱讀它,因爲我不能把標題正確地在這個評論中:/ –