отладка вставки MySQL не удается в PHP - PullRequest
0 голосов
/ 24 декабря 2010

У меня проблемы с отладкой сбойной вставки mysql 5.1 под PHP 5.3.4. Кажется, я ничего не вижу в журнале ошибок mysql или php.

Основываясь на презентации Yahoo по эффективной разбивке по страницам, я добавлял номера заказов на плакаты на моем сайте (рейтинг заказов, а не продажи заказов).

Я написал приложение для быстрого тестирования и попросил создать номера заказов для одной категории. В этой категории 32 233 строки, и каждый раз, когда я запускаю ее, я обновляю 23 304 строки. Каждый раз. Я увеличил использование памяти, я вставил в скрипт параметр ini, я запускаю его из PHP CLI и PHP-FPM. Каждый раз, когда он не обновляет 23 304 строки.

Вот мой сценарий, к которому я добавил огромные тайм-ауты.

include 'common.inc'; //database connection stuff
ini_set("memory_limit","300M");
ini_set("max_execution_time","3600");
ini_set('mysql.connect_timeout','3600');
ini_set('mysql.trace_mode','On');
ini_set('max_input_time','3600');
$sql1="SELECT apcatnum FROM poster_categories_inno LIMIT 1";
$result1 = mysql_query($sql1);
while ($cats = mysql_fetch_array ($result1)) {
$sql2="SELECT poster_data_inno.apnumber,poster_data_inno.aptitle FROM poster_prodcat_inno, poster_data_inno WHERE poster_prodcat_inno.apcatnum ='$cats[apcatnum]' AND poster_data_inno.apnumber = poster_prodcat_inno.apnumber ORDER BY aptitle ASC";
$result2 = mysql_query($sql2);
$ordernum=1;
while ($order = mysql_fetch_array ($result2)) {
$sql3="UPDATE poster_prodcat_inno SET catorder='$ordernum' WHERE apnumber='$order[apnumber]' AND apcatnum='$cats[apcatnum]'";
$result3 = mysql_query($sql3);
$ordernum++;
} // end of 2nd while
}

Я в головокружительной потере. Только что сделал тест на меньшую категорию, и только 13 199 из 17 662 строк были обновлены. Для двух экспериментов обновляется только 72-74% строк.

Ответы [ 2 ]

1 голос
/ 24 декабря 2010

Я бы сказал, что ваша проблема связана с вашим вторым запросом.Вы сделали EXPLAIN на нем?Из-за условия ORDER BY потребуется сортировка файлов.Если у вас нет подходящих индексов, которые могут замедлить ситуацию дальше.Попробуйте этот синтаксис и подпишите правильное целое число для вашей переменной apcatnum во время тестирования.

SELECT d.apnumber, d.aptitle 
FROM poster_prodcat_inno p JOIN poster_data_inno d
  ON poster_data_inno.apnumber = poster_prodcat_inno.apnumber 
WHERE p.apcatnum ='{$cats['apcatnum']}' 
ORDER BY aptitle ASC; 

Во-вторых, поскольку catorder - это просто целочисленная версия комбинации apcatnum и aptitle, этоденормализация для удобства.Это не обязательно плохо, но это означает, что вы должны обновлять его каждый раз, когда добавляете новый заголовок или категорию.Возможно, было бы лучше разбить вашу таблицу poster_prodcat_inno на apcatnum и просто выполнить JOIN с poster_data_inno, когда вам действительно нужен catorder.

1 голос
/ 24 декабря 2010

Пожалуйста, избегайте ввода запроса, даже если он поступил из вашей собственной базы данных (кавычки и другие символы будут получать вас каждый раз).Ваш оператор SQL неверен, потому что вы не используете переменные правильно, используйте подсказки, такие как:

while ($order = mysql_fetch_array($result2)) {
    $order = array_filter($order, 'mysql_real_escape_string');
    $sql3 = "UPDATE poster_prodcat_inno SET catorder='$ordernum' WHERE apnumber='{$order['apnumber']}' AND apcatnum='{$cats['apcatnum']}'";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...