2015-06-19 72 views
0

我有一個有三列並使用PHP的小表。 (id)unsigned int(10),gameid unsigned int(10),userid unsigned int(10)) - id,gameid和userid被編入索引。MySQL COUNT與SELECT行的性能

有些時候(當玩家加入遊戲時)系統會檢查遊戲中是否已經有100個玩家,如果是這樣,它會檢索所有行並對它們執行一些操作,最後會刪除行。

SELECT查詢:

SELECT * FROM table WHERE gameid = 1 ORDER BY id ASC LIMIT 100 

統計查詢:

SELECT COUNT(*) as rows FROM table WHERE gameid = 1 LIMIT 100 

刪除查詢:

DELETE FROM table WHERE gameid = 1 ORDER BY id ASC LIMIT 100 

我的問題是關於性能和速度,這將是更好的:

方法1(3查詢)

  • 執行COUNT查詢並檢查有多少行是在表
  • 如果行> = 100做:
    • 執行SELECT查詢和處理數據
    • ,可執行刪除查詢

方法2(2查詢)

  • 執行SELECT查詢
  • 如果count(行)> = 100的更多信息:
    • 過程中的數據
    • ,可執行刪除查詢

什麼辦法將更好地使用?

感謝

+0

自己嘗試一下,看看哪一個需要較長的時間。 –

回答

1

microtime(true)是你的PHP的朋友。

如果啓動與gameid索引,「辦法1」 威力會更快,因爲它可以在指數做COUNT(*)

在另一方面,有兩件事情,反對數:

  • 3查詢通常大於2
  • 慢如果有很多超過100行與gameid = 1(不似乎是這種情況),它會花更多的時間做全部計數。 「方法2」停在100。

我認爲真正的答案是「沒有這兩個之間有足夠的差異關係。

+0

是的,我做了一些測試並計算本身比慢select查詢沒有多大意義,但差別很大,count查詢需要執行0.00xxx,選擇需要0.000xxx才能執行,所以count + select會比只選擇要多3倍 –

+0

可能是虛驚一場 - 做' COUNT(*)'可能會將各種塊帶入緩存(RAM),然後另一個'SELECT'不需要加載這些塊,或者你打開了查詢緩存,並且你剛剛完成了'SELECT'。 –