2015-03-26 3 views
1

У меня есть PHP-скрипт, который очень быстро передает большое количество запросов в БД. Предоставляет ли MySQL DB запросы по мере их поступления, если они не могут обрабатывать их с той же скоростью, которую они передают, или они теряются?PHP MySQL большое количество передаваемых запросов,

Моя программа написала и передала синтаксически корректные запросы к БД, но БД очень далеко позади в информации, содержащейся в таблицах и количестве таблиц.

Некоторые примеры кода (я немного новичок в PHP, так что мой код/​​стиль кодирования может быть ужасающим):

//If table has one primary key 
     $val = $tblColPkArray[0]; 

     $pkInsert = ", PRIMARY KEY (". $val['COLUMN_NAME'] .")"; 
     $pkColName = $val['COLUMN_NAME']; 

     $string = ltrim($string, ","); 

     $oneCreateTableQuery = $beginning . $string . $pkInsert . $end; 

     echo $oneCreateTableQuery . "\n"; 

     $newLink->query($oneCreateTableQuery); 

     $pkValuesInOld = "SELECT " . $pkColName . " FROM " . $tables . ";"; 

     $pkValsResult = $link->query($pkValuesInOld); 

     while($pkValues = $pkValsResult->fetch(PDO::FETCH_ASSOC)) 
     { 
      $pkRowValuesQuery = "SELECT * FROM " . $tables . " WHERE " . $pkColName . " = '" . $pkValues[$pkColName] . "';"; 

      echo $pkRowValuesQuery . "\n"; 

      $valsOfPkInOldTable = $link->query($pkRowValuesQuery); 

      while($pkVals = $valsOfPkInOldTable->fetch(PDO::FETCH_ASSOC)) 
      { 
       //var_dump($ckVals); 

       $insertBeginning = "INSERT INTO " . $tables . "("; 
       $insertValuesSection = ") VALUES ("; 
       $insertEnd = ");"; 
       $keys = ""; 
       $rowValues = ""; 

       foreach($pkVals as $key => $value) 
       { 
        $keys = $keys . ", " . $key; 
        $rowValues = $rowValues . ", '" . $value . "'"; 
       } 

       $insertStatement = $insertBeginning . ltrim($keys, ",") . $insertValuesSection . ltrim($rowValues, ",") . $insertEnd; 

       echo $insertStatement . "\n"; 

       $newLink->query($insertStatement); 

      }//While loop: Inserting values of old table into new table via INSERT INTO statement 

      //unset(); 

     } //While loop: Selecting all values from old table based on PK values per table, pass result of that query to next while loop 
+0

Можете ли вы опубликовать код, показывающий, что вы пытаетесь сделать? Не можете ли вы использовать транзакцию (http://stackoverflow.com/a/2708247/1492578)? –

+0

Добавил новый код –

ответ

1

Вы можете сделать это в одном запросе, вместо вызова нескольких операторов вставки. Например, вместо того, чтобы эти 3 запросы,

INSERT INTO table VALUES(1, 2); 
INSERT INTO table VALUES(3, 4); 
INSERT INTO table VALUES(5, 6); 
... 

Вы можете запустить этот запрос:

INSERT INTO table VALUES(1, 2), (3, 4), (5, 6), ...; 
+0

Нужно ли вам каждый раз указывать 'значения'? Я думал, что это было просто скобкой после первого. – chris85

+0

Ой, мой плохой. Починил это. –

+0

Я сделаю это. Спасибо –

1

Похоже, вы могли бы сделать даже объединить INSERT и SELECT:

INSERT INTO table (...) 
    SELECT ... FROM ...; 

Кроме того, ваши вложенные петли выглядят так:

INSERT INTO table (...) 
    SELECT ... FROM ... 
       JOIN ...; 

Это приведет к одному позвоните по номеру ->query() и устраните большую часть вашего кода.

+0

Работает ли это с базами данных, проживающими по разным адресам? Я пробовал это с двумя базами данных по одному и тому же адресу (то есть как по 127.0.0.1, так и по одному на 127.0.0.1, а другой на www.url.com), и этот запрос работал, но я не успел использовать он для баз данных с двумя разными адресами. –

+0

Два разных _servers_ - это другая задача. См. FEDERATED engine или FederatedX от MariaDB. –

Смежные вопросы