Mysql PHP Script для замедления нуждается в рефакторинге - PullRequest
3 голосов
/ 01 февраля 2010

Привет, у меня есть 2 таблицы mysql, и они обе нуждаются в обновлении,

companies
unique_code

В компаниях хранится 1 миллион записей, и мне нужен уникальный код для каждой из них, проблема в том, что мой 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 ]

3 голосов
/ 01 февраля 2010

Если вы просто пытаетесь добавить новый первичный ключ в таблицу (и, следовательно, одноразовый процесс), не делайте этого в PHP.Используйте MySQL напрямую и используйте alter table для выполнения работы.MySQL будет работать быстрее напрямую и не столкнется с проблемами синхронизации для длинных процессов, таких как PHP.

Если вы пытаетесь заняться чем-то другим, возможно, вы захотите добавить немного больше схемы таблицы, мне не совсем ясно, что я правильно понял вашу цель.

0 голосов
/ 01 февраля 2010

Я надеюсь, что уникальный код является первичным ключом, плюс проверьте, можно ли проиндексировать поле, используемое в предложении WHERE, если это не первичный ключ. T

Откуда вы знаете, что база данных является узким местом? Вы можете использовать Xdebug для профилирования, чтобы вы могли увидеть, где на самом деле находится горлышко бутылки.

Вы можете использовать Memchace, чтобы хранить в памяти наиболее часто используемые объекты и уменьшать попадания в базу данных при чтении (SELECT).

0 голосов
/ 01 февраля 2010

Включили ли вы индексирование по конкретным полям? Также убедитесь, что вы выбрали обязательные поля в своем запросе, а не все (*):

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

Вместо того, чтобы:

$query="SELECT field1, field2, field3, etc FROM unique_code WHERE used = 0"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...