如何检查表中是否存在来自10亿行表

时间:2016-08-22 17:41:33

标签: php mysql

我有一个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天内没有更新?

1 个答案:

答案 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*)