вставить и обновить внутри цикла - PullRequest
1 голос
/ 26 января 2010

У меня есть скрипт php, я использую его для запуска в качестве задания cron.

Когда этот скрипт выполняется, это занимает около 13 минут для 16000 пользовательских записей.

Пожалуйста, посоветуйте мне, чтобы этот скрипт работал с максимальной производительностью.

Мне нужно знать, что если возникнут какие-либо проблемы, если я добавлю обновление, вставьте его в цикл или вставьте и обновите его внутри цикла.

$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 Ответ

2 голосов
/ 26 января 2010

Мне нужно знать, что если возникнут какие-либо проблемы, если я добавлю обновление, вставьте его в цикл или вставьте и обновите его внутри цикла.

Конечно, это проблема.

Вы должны избавиться от цикла и сделать ваши операции основанными на наборе:

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}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...