2014-01-26 40 views
0

我正在根據其他表的狀態從一個表中刪除記錄,並從服務器產生很長的響應時間。基於其他查詢結果的SQL查詢 - 爲什麼速度慢?

基本上如果theres a namestatus = 'p1'查詢shold delete記錄另一個表。問題是我的那log_player_loginWHERE timestamp > '$timeHuman' AND status = 'p1'

我做錯了什麼?

DELETE FROM pstone_cuboids 
WHERE owner NOT IN (
    SELECT DISTINCT(name) 
    AS name 
    FROM log_player_login 
    WHERE timestamp > '2013-01-01 00:00:00' AND status = 'p1' 
); 

來源:

enter image description here

+2

你是什麼意思「有滯後」? –

+0

服務器響應時間長。 –

+0

。 。 'lag'在SQL中具有特定的含義,因爲它是函數的名稱。我猜這就是你的意思。一個更好的方式來描述它會是這樣的:「爲什麼要花這麼長的時間?」或「花太長時間」。 –

回答

1

直到最近的MySQL版本,not in使用子查詢的是相當低效。我建議用not exists替換它,並添加索引:

DELETE FROM pstone_cuboids 
WHERE not exists (SELECT 1 
        FROM log_player_login lpl 
        WHERE lpl.timestamp > '2013-01-01 00:00:00' AND lpl.status = 'p1' and 
         lpl.name = pston_cuboids.owner 
       ); 

create index log_player_login_owner_status_timestamp on log_player_login(name, status, timestamp); 

指數應該有所有三個字段,最後一個需要是timestamp

+0

升級mysql怎麼樣?我確實有'MySQL:5.5.33' –

+0

爲什麼要添加索引?從未使用過,它會如何影響我的數據? –

+0

@Ultra。 。 。我認爲子查詢的修正版本是5.6x版本。您希望索引提高性能。這主要是索引是什麼(他們也強制執行獨特的約束)。 –