2010-01-26 63 views
1

我有一个PHP脚本,我用它作为cron作业运行。插入然后更新内循环

当运行该脚本的脚本在16000条用户记录上大约需要13分钟时。

请指教我使这个脚本以最佳性能运行。

我需要知道,如果有任何问题,如果我把更新然后插入循环内,或插入然后更新内循环。

$db_conn = getDbObject('my_db'); 

$now_timestamp = time(); 

$message_text = getMessage('notify'); 

$users_sql = "SELECT * FROM users_tbl WHERE status = 'sub' and expire_timestamp < '{$now_timestamp}' "; 

$users_result = mysql_query($users_sql,$db_conn); 

while($user_row = mysql_fetch_assoc($users_result)){ 

    $update_user_sql = "UPDATE users_tbl SET status = 'pending' WHERE user_id = '{$user_row['user_id']}' "; 

    mysql_query($insert_message_sql,$db_conn); 

    $insert_message_sql = "INSERT INTO 
           messages_tbl 
             (
              message_id , 
              message_text , 
              user_id , 
              status       
             ) 
            VALUES 
             (
              NULL , 
              '{$message_text}', 
              '{$user_row['user_id']}', 
              '0',            
             )"; 


    mysql_query($insert_message_sql,$db_conn); 

} 

mysql_close($db_conn); 
+0

它应该是不错的,你使用SQL参数,这样你就可以准备SQL语句首次执行它们氮。但我不知道如何在PHP中做到这一点。另一个好处是可以进行有限的工作(最多记录)并多次调用,以避免请求超时,但在这种情况下,您将必须在下一次处理“下一个挂起”记录时执行它。 – helios 2010-01-26 11:42:51

回答

2

我需要知道,如果有任何问题,如果我把更新已再一个循环内插入,或插入,然后在循环中更新。

确定这是一个问题。

你应该摆脱循环,使您的操作设置为基础的:

INSERT 
INTO messages_tbl (message_id, message_text, user_id, status) 
SELECT NULL, '{$message_text}', user_id, '0' 
FROM users_tbl 
WHERE status = 'sub' 
     AND expire_timestamp < '{$now_timestamp}' 

UPDATE users_tbl 
SET  status = 'pending' 
WHERE status = 'sub' and expire_timestamp < '{$now_timestamp}'