4

对于愚蠢的问题,我很抱歉,但我有一个这样的日子,我觉得自己是最愚蠢的程序员。我需要你的帮助。我目前正在使用 PHP 和 MYSQL 进行开发,我的技能非常低,我正在处理继承的项目。

我有一个包含近 6k 条记录的数据库表,比如说 TABLE_A,我需要遍历 TABLE A 中的记录,并为每条记录在 TABLE B 中创建两个新记录,其中来自 TABLE_A(Id) 的 PK 是 TABLE_B 中的 FK。没什么特别的吧?所以我还有一件事,这正在发生,请不要责怪,在生产数据库中。所以我收到了一个请求,要求每 1 秒只插入 10 条记录到表 B 中。此外,我的 ID 列表如下所示:1,2,4,6,7,8,9,11,12,15,16,.. 到 6k。所以我基本上不能这样做:

for ($i = 1; $i <= MAX(id); $i++) {
    //create two new records in TABLE B
}

我花了一些时间进行研究,我需要和你们谈谈,想出一些想法。我不想从你那里得到确切的解决方案,但我想学习如何思考这个问题以及如何提出解决方案。我在回家的路上一直在想。所以我只是在脑海中创建了算法。以下是关于我所知道的以及我可能会使用的内容的分步过程:

  1. 我知道我每 1 秒只能运行 10 次插入 - 所以我需要将 TABLE A 中的选择限制为一批中的 5 行。
  2. 所以我可能可以使用 MySQL 语法:LIMITOFFSET,例如:select * from t LIMIT 5 OFFSET 0
  3. 这意味着我必须存储上一批中最后一条记录的 id。
  4. 完成当前批次后,我需要等待 1 秒(我正在考虑使用 PHP 方法sleep())才能开始新批次。
  5. 我需要循环
  6. TABLE_A 中的确切行数目前无法使用
  7. 新记录的插入很简单。专注于迭代。

所以这是我在纸上的一些东西,我不太确定它是否会起作用,因为我真的想从这个问题中学到一些东西。我将跳过周围的事情,比如连接数据库等,只关注算法,并编写一些混合 PHP/Mysql/Pseudo 代码。

$limit=5
$offset=0;

function insert($limit, $offset){
   $stm = $db->prepare("SELECT id FROM tableA LIMIT :limit OFFSET :offset");
   $stm->execute(array('limit' => $limit, 'offset' => $offset));
   while($stm->rowCount() > 0){ 
      $data = $stm->fatchAll();
      foreach($data as $row){
         // insert into TABLE_B
      }
      sleep(1);
      $offset +=5;
      $this->insert($limit, $offset);
   }
}

我不完全确定,如果这种递归有效。在纸面上看起来是可行的。但是性能呢?在这种情况下有问题吗?

也许主要问题是:我是不是在想这个?你知道更好的解决方案如何做到这一点吗?

感谢您对您的程序如何提出可行的解决方案的任何意见、想法、建议、想法和详细描述。可能我应该更深入地研究一些算法分析和设计。你知道有什么好的资源吗?

(抱歉语法错误,我不是母语人士)

4

1 回答 1

3

我不知道为什么你必须每 1 秒向表 B 插入 10 条记录,但我们假设这个条件不能改变。

您的源代码是正确的,但是这里不需要递归,我们应该这样做。

limit=5
offset=0

while (itemsA = fetch_from_a(limit, offset)) {
    # you should do a batch insertion here, see MySQL's documentation.
    insert_into_B(itemsA);         
    sleep(1);
    offset += 5;
}

# prototype
# fetch some records from table A, return array of found items 
# or an empty array if nothing was found.
function fetch_from_a(limit, offset);
于 2013-05-23T06:21:39.160 回答