插入然后更新内部循环

时间:2010-01-26 11:35:31

标签: php mysql performance insert

我有一个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);

1 个答案:

答案 0 :(得分: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}'