对于愚蠢的问题,我很抱歉,但我有一个这样的日子,我觉得自己是最愚蠢的程序员。我需要你的帮助。我目前正在使用 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 秒只能运行 10 次插入 - 所以我需要将 TABLE A 中的选择限制为一批中的 5 行。
- 所以我可能可以使用 MySQL 语法:
LIMIT
和OFFSET
,例如:select * from t LIMIT 5 OFFSET 0
- 这意味着我必须存储上一批中最后一条记录的 id。
- 完成当前批次后,我需要等待 1 秒(我正在考虑使用 PHP 方法
sleep()
)才能开始新批次。 - 我需要循环
- TABLE_A 中的确切行数目前无法使用
- 新记录的插入很简单。专注于迭代。
所以这是我在纸上的一些东西,我不太确定它是否会起作用,因为我真的想从这个问题中学到一些东西。我将跳过周围的事情,比如连接数据库等,只关注算法,并编写一些混合 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);
}
}
我不完全确定,如果这种递归有效。在纸面上看起来是可行的。但是性能呢?在这种情况下有问题吗?
也许主要问题是:我是不是在想这个?你知道更好的解决方案如何做到这一点吗?
感谢您对您的程序如何提出可行的解决方案的任何意见、想法、建议、想法和详细描述。可能我应该更深入地研究一些算法分析和设计。你知道有什么好的资源吗?
(抱歉语法错误,我不是母语人士)