@tobut

Почему некоторые INSERT-ы не добавляются?

while(1) {
$PDO = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$PDO->exec("TRUNCATE TABLE fonbet");

foreach($data as $object) {
   $sql = "INSERT INTO fonbet (id, password, куча полей)  VALUES (:id, :password, куча значений)";
   $query = $PDO->prepare($sql);
   $query->execute(array(':id'=>$object->id, ':password'=>$object->password, куда соответствий));
}
}

Есть таблица ~100 строк, который обновляется примерно 2 раза в секунду. Поскольку данные разные, то приходится стирать ее и добавлять циклом данные. Проблема заключается в том, что после каждой такой операции в таблицу попадает от 0 до 100 процентов данных. Добавлю, что "куча полей" ~ 20.

Что касается нагрузки:
show processlist - не показывает очереди (субъективно, так как невозможно часто щелкать)
show status - pastebin.com/jyKz83qS (верхние записи почему-то вообще не показывает)
top -
PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 2342 root      20   0  172m  34m  13m S  32.6  6.9   7:01.99 php
 2248 mysql     20   0  890m 225m  15m S   6.3 45.7   0:54.46 mysqld


Буду рад любой помощи. Как минимум, мне кажется, что запрос можно составить более правильно.
UPD: Добавлю настройки my.cnf моего mysql-сервера - pastebin.com/qdFeQdr3 (всего 512 мб оперативной памяти)
  • Вопрос задан
  • 734 просмотра
Решения вопроса 1
Tpona
@Tpona
Ужасный перфекционист
Не плохо было бы обработать ошибки
php.net/manual/ru/pdo.errorinfo.php
при выполнении prepare/execute
И еще - вечный цикл? Может по крону дергать? Это же время выполнения скрипта нужно делать вечным, у Вас в php.ini выставлено или на скрипт? Хотябы слип минимальный поставьте, а то как то не айс.

Да и что-то мне подсказывает, что идеология нарушена?
Мне кажется prepare нужно за цикл вынести и сделать это все транзакцией, нет?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы