我有一个Data Scraping脚本。
它运行并擦除记录,保存到10列表中。
对于DB中已存在的记录,如果旧记录在过去2天内未更新,我需要更新旧记录。
我的表有字段scraper_run_inserted
(插入记录时的DATETIME值)和scraper_run_updated
(记录更新时的DATETIME值)
该表有10亿行,
当脚本启动时,我会获得所有不需要更新的记录。
这个问题太长了......
$doNotupdateLicencesList = "SELECT DISTINCT(licence_id) FROM `{$onegov_main_table}` WHERE scraper_run_updated >= '{$prev_date_to_check}'";
$doNotupdateLicencesList = $conn->prepare($doNotupdateLicencesList);
$doNotupdateLicencesList->execute();
$doNotupdateLicencesList = $doNotupdateLicencesList->fetchAll(PDO::FETCH_COLUMN);
在$doNotupdateLicencesList
数组中的我有我不想更新的所有记录。
我的刮刀迭代网站的页面并从每个页面抓取一个列表licence_ids
。
此数组$allLicencesOnThisPage
包含特定网页上的所有许可。
这就是我做的......
这个圈子太长了
foreach ($doNotupdateLicencesList as $licence_id) {
if (isset($allLicencesOnThisPage[$licence_id])) {
unset($allLicencesOnThisPage[$licence_id]);
}
}
我需要做什么来优化代码?
在抓取过程中,我是否应该针对每个条目对数据库进行SELECT
查询,以检查是否存在且过去2天内没有更新?
答案 0 :(得分:1)
您可能需要采取两个步骤来加快速度:
首先,更改查询以获取过去2天未插入或更新的许可证:
SELECT DISTINCT(licence_id) FROM `{$onegov_main_table}`
WHERE scraper_run_inserted < DATE_SUB(CURDATE(), INTERVAL 2 DAY)
AND scraper_run_updated < DATE_SUB(CURDATE(), INTERVAL 2 DAY)
其次,您希望在要查询的所有表上创建索引以加快查询速度。这只需要完成一次。
ALTER TABLE {table_name} ADD INDEX license_insert (`licence_id`, `scraper_run_inserted`, `scraper_run_updated`);
这两个步骤将减少查询时间和需要检查的许可证数量。如果没有大量许可证,那么您也可以将其添加到查询中并删除PHP循环。
SELECT DISTINCT(licence_id) FROM `{$onegov_main_table}`
WHERE scraper_run_inserted < DATE_SUB(CURDATE(), INTERVAL 2 DAY)
AND scraper_run_updated < DATE_SUB(CURDATE(), INTERVAL 2 DAY)
AND licence_id NOT IN (*comma separated list of IDs here*)