2014-04-17 52 views
0

我想修改一个包含3个表插入,一个表更新和一个删除过程的cron脚本。 有成千上万条记录,因此插入数据需要很长时间。MySQL插入和更新优化

将数据插入产品表,产品付款表,产品明细表和产品图片表中。

当前脚本检查产品是否存在。 如果不存在,则先将数据插入产品表并返回新插入的产品ID。之后,插入发生在其他三张桌子上。图像表中可能有多个插入(取决于图像的数量)。

如果产品已经存在,请更新表格。对于图像表,该脚本删除该特定产品的现有图像记录,然后将所有图像作为新图像插入到图像表中。

这就是现在发生的事情:

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

取决于您所做的更改,您可能可以通过执行INSERT INTO ..... ON DUPLICATE KEY UPDATE处理逃脱。这样,你可以插入一个记录,如果新的,如果没有更新它。最重要的是,使用INSERT,您可以在一条SQL语句上处理数百条记录,这可以大大减少所需的语句数量。 – Kickstart

回答

0

另一种处理大量数据的方法是创建一个临时表(可能使用ENGINE = MEMORY)并对该表执行批量插入操作。因此,不是一次添加一个数据集,而是使用多个集创建SQL插入并一次添加它们。 这比循环遍历元素更快,并为每个数据集调用插入。

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

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