Mysql PHP脚本缓慢需要重构

时间:2010-02-01 14:04:55

标签: php mysql

您好我有2个mysql表,他们都需要更新,

companies
unique_code

公司拥有100万条记录,我需要一个独特的代码来签署每个,我遇到的问题是我的PHP脚本抓住所有公司,并在foreach循环中从表unique_code和更新中获取唯一代码,然后它还更新unique_code用于标记代码的表已被使用。

PHP代码只会挂起很长时间并达到最大执行限制。我真的很困难,需要这些公司拥有一个独特的代码,任何人都可以想到另一种方法吗?

制定代码示例。

 foreach ($aCompanies as $companies){

   $query="SELECT * FROM unique_code WHERE used = 0"

   foreach(unique_code as code){
       //  UPdate companies table
       $query = "UPDATE companies SET id = $code";
       // Flag code used
       $query = "UPDATE unique_codes WHERE code = $code";
   }
}

为你的时间干杯。

完整代码:

$query1 = "SELECT code FROM unique_codes WHERE used = 0\n";
$aUniqueCode = $oDbh->getAll($query1);

$query2 = "SELECT id FROM companies";
$aCompanies = $oDbh->getAll($query2);

foreach ($aCompanies as $companies){

    $query = "SELECT code FROM unique_codes WHERE used = '0' LIMIT 1";
    $oCode = $oDbh->getRow($query);

    $query3.= "UPDATE companies SET code = $oCode->code WHERE id = $companies->id\n";   

    $query4 = "UPDATE unique_codes SET used = '1' WHERE code = $oCode->code\n";
    $oDbh->query($query4);      
}
print print_r($query3).';';
exit;

我正在做的不是更新我将所有SQL导出到文件的公司,以便我可以在以后导入。

3 个答案:

答案 0 :(得分:3)

如果您只是尝试向表中添加新的主键(因此一次性进程),请不要在PHP中执行此操作。直接使用MySQL并使用alter table来完成工作。 MySQL将直接更快,并且不会遇到PHP等长进程的时序问题。

如果您正在尝试做其他事情,您可能想要更多地使用表格架构,我并不完全清楚我的目标是否正确。

答案 1 :(得分:0)

您是否开启了特定字段的索引?还要确保在查询中选择必填字段而不是全部(*):

$query="SELECT * FROM unique_code WHERE used = 0"

相反:

$query="SELECT field1, field2, field3, etc FROM unique_code WHERE used = 0"

答案 2 :(得分:0)

我希望uniuque代码是主键,并检查WHERE子句中使用的字段是否可以编入索引(如果它不是主键)。 Ť

你怎么知道数据库是瓶颈?您可以使用Xdebug进行分析,这样您就可以看到瓶颈的位置。

您可以使用Memchace,这样您就可以在内存中存储最常用的对象,并在阅读时减少数据库命中(SELECT)。