我想修改一个包含3个表插入,一个表更新和一个删除过程的cron脚本。 有数千条记录,因此插入数据需要很长时间。
将数据插入到产品表,产品付款表,产品详细信息表和产品图像表中。
当前脚本检查产品是否存在。 如果不存在,则首先将数据插入到产品表中,然后返回新插入的产品ID。之后,插入发生在其他三个表中。图像表可能有多个插入(取决于图像的数量)。
如果产品已存在,请更新表格。对于images表,脚本会删除该特定产品的现有图像记录,然后将所有图像作为新图像插入到images表中。
这就是现在发生的事情:
if(!$prod_exists){
$product_id = insert_product($product_data) ;
if($product_id){
insert_payment($paymnt_data, $product_id);
insert_details($details_data, $product_id);
insert_images($image_data, $product_id);
}
}else{
update_product($product_data, $product_id)
update_payment($paymnt_data, $product_id);
update_details($details_data, $product_id);
delete_images($product_id);
insert_images($image_data, $product_id);
}
由于数据量巨大,执行时间较长。有什么方法可以优化整个过程吗?
由于 中号
答案 0 :(得分:0)
所做的是使用REPLACE INTO
sql查询来插入行或一次性替换值。
看一下这篇文章:http://blogs.coldbuffer.com/inserting-or-updating-records-using-mysql-replace
答案 1 :(得分:0)
假设MySQL:
准备好的陈述!
http://uk1.php.net/pdo.prepared-statements
如果您正在谈论成千上万的疑问,这将极大地解决您的速度问题。
另外,如果您使用的是InnoDB(至少应该是!),请至少在事务中包装每个查询块:
https://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html
这对速度没有帮助,但会使整个操作更安全。
答案 2 :(得分:0)
处理大量必须添加/更新的数据的另一种方法是创建临时表(可能使用ENGINE = MEMORY)并对该表进行批量插入。因此,不是一次添加一个数据集,而是创建具有多个集的sql插入,并立即添加它们。 这比循环元素并为每个数据集调用插入更快。
之后,您可以通过将原始表与该临时表连接来进行批量更新,因为这也更快。
我们正在使用这个概念来加快插入/更新。