插入然后更新内循环
问题描述:
我有一个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);
答
我需要知道,如果有任何问题,如果我把更新已再一个循环内插入,或插入,然后在循环中更新。
确定这是一个问题。
你应该摆脱循环,使您的操作设置为基础的:
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}'
它应该是不错的,你使用SQL参数,这样你就可以准备SQL语句首次执行它们氮。但我不知道如何在PHP中做到这一点。另一个好处是可以进行有限的工作(最多记录)并多次调用,以避免请求超时,但在这种情况下,您将必须在下一次处理“下一个挂起”记录时执行它。 – helios 2010-01-26 11:42:51