我需要创建一个MySQL游标,以便在遍历一个“巨大”(数百万个实体)表时跟踪我当前要达到的行号。
样本数据库表:
CREATE TABLE test (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
someText TEenter code hereXT NOT NULL
) ;如果此表为1,000,000项,则执行以下查询:
select * from test where id >= 50;然后,根据我的php脚本中的需要处理数据(限制为1分钟)。如何跟踪已遍历"test“表的行?
发布于 2011-01-12 00:25:47
// use a PHP session to store the id (could also use cookies...)
session_start();
// your 1 minute timeout
set_time_limit(60);
// query your results (may even put a known-out-of-reach limit on the
// query just to make sure you're not always pulling all the entries every
// reload (that would each up your timeout alone, depending)
$lastID = 0; // lowest possible ID value (e.g. MIN(id) )
if (session_is_registered('last_select_id'))
{
$lastID =(int)$_SESSION['last_select_id'];
}
else
{
session_register('last_select_id');
$_SESSION['last_select_id'] = $lastID;
}
$dbResult = mysql_query("SELECT * FROM test WHERE id>{$lastID} ORDER BY id"/* LIMIT 10000 */);
if ($dbResult)
{
while (($row = mysql_fetch_row($dbResult)) !== false)
{
// perform processing
// mark as last processed (depending how many steps,
// you may decide to move this from end to somewhere
// else, just sh*t luck where your timeout occurs)
$_SESSION['last_select_id'] = $row['id'];
}
}
// it reached the end, save to assume we can remove the session variable
session_unregister('last_select_id');我只能按你说的做,尽管我觉得这应该是本机的节流,而不仅仅是等待PHP吐出一个超时。
编辑的另一种方法,扩展了批处理思想,就是修改表并添加一个可以更新的“已处理”列。
EDIT2也要小心。我确实设置/取消了会话值。由于这个原因,如果您刷新了一个成功的页面加载,而不是一个超时错误( $lastID不会看到会话变量,它将在1重新启动,然后继续执行),那么这个循环就会无限循环。
https://stackoverflow.com/questions/4664124
复制相似问题