您好我有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导出到文件的公司,以便我可以在以后导入。
答案 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)。