编程语言
首页 > 编程语言> > PHP检查行是否存在的最有效方法

PHP检查行是否存在的最有效方法

作者:互联网

考虑下表

+-------------+---------+------+-----+---------+----------------+
| Field       | Type    | Null | Key | Default | Extra          |
+-------------+---------+------+-----+---------+----------------+
| id          | int(11) | NO   | PRI | NULL    | auto_increment |
| date        | date    | NO   |     | NULL    |                |
| sku         | varchar(10)    |     |         | NULL           |         
| impressions | int(11) | NO   |     | NULL    |                |
| sales       | int(11) | NO   |     | NULL    |                |
+-------------+---------+------+-----+---------+----------------+

每天从前几天的销售记录中批量下载该表.

每天下载的数据不仅包含前几天的销售数据,还包含过去90天的所有数据(可能有5万条记录).

但是,由于原本插入的内容由于我们无法控制的原因(例如,

第一天

Date: 2015-01-01
SKU:  ABCD
Impressions:  100
Sales: 0

第二天

Date: 2015-01-01
SKU:  ABCD
Impressions:  100
Sales: 3

Date: 2015-01-02
SKU:  ABCD
Impressions:  105
Sales: 0

因此,对于数据下载中的任何给定记录,

a)已经见过并且和以前一样-忽略
b)新增-添加到数据库
c)已经看到但有新数据-更新

可以通过检查每一行来解决这个问题

while (!$file->eof()) {
      $row = $file->fgets();
      $data = explode("\t", $row);
      $sku = $data[0];
      $date = $data[1];
      $impressions = $data[2];
      $sales = $data[3];
      $order = $em->getRepository('Orders')->findOneBy(['sku' => $sku, 'date' => $date]);
      if($order && $order->getImpressions() != $impressions && $order->getSales() != $sales) {
            $order->setImpressions($impressions);
            $order->setSales($sales);               
      } else {
        ... create new model
      }
      $em->persist($order);
}

但是,将要更新数据的行将是最少的,并且对每一行进行选择将意味着由于行数巨大,此工作将非常缓慢.

所以我的问题是,可以使用什么模式来尽可能有效地解决这个问题?

任何想法欢迎

解决方法:

我建议您用新下载的数据完全替换之前90天的数据.

推理很简单:

>处理时间很短. 50,000行对于数据库而言很小.即使是一百万行,我也可能会这样做.
>仅尝试替换已更改的行很复杂,并且可能会引入错误.

标签:doctrine,mysql,php
来源: https://codeday.me/bug/20191118/2031001.html