MySQL插入和更新优化

时间:2014-04-17 14:11:04

标签: php mysql optimization

我想修改一个包含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); 
}

由于数据量巨大,执行时间较长。有什么方法可以优化整个过程吗?

由于 中号

3 个答案:

答案 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插入,并立即添加它们。 这比循环元素并为每个数据集调用插入更快。

之后,您可以通过将原始表与该临时表连接来进行批量更新,因为这也更快。

我们正在使用这个概念来加快插入/更新。