Сортировка большого набора данных не завершена - PullRequest
0 голосов
/ 14 апреля 2011

Это продолжение отладки ошибки вставки mysql в php , так как у меня теперь есть время продолжить проект.

У меня есть три таблицы с этой проблемой:
840,721плакаты в poster_prodcat
58 506 категорий плакатов в poster_categories
17 629 007 (17 миллионов +) комбинаций плакатов / категорий в плакате_prodcat

На основе презентации «Эффективное разбиение на страницы» в Yahoo !, я пытаюсь добавить рейтинг категориичисло для poster_prodcat, чтобы мы могли постранично ранжировать, а не использовать ограничения и смещения.Несмотря на то, что мой тайм-аут подключения php mysql был увеличен до 3600 (сумасшествие, которое я знаю), а время тайм-аута php изменилось, упорядочение никогда не завершается.может быть, от нескольких десятков до, может быть, ста тысяч или около того, но не полный набор в 17 000 000.

Вот сценарий:

$sql1="select distinct apcatnum from poster_prodcat";
$result1 = mysql_query($sql1);

while ($cats = mysql_fetch_array ($result1)) {
  $sql2 = "SELECT poster_data.apnumber,poster_data.aptitle 
           FROM poster_prodcat,poster_data 
           WHERE poster_prodcat.apcatnum ='$cats[apcatnum]' 
           AND poster_data.apnumber = poster_prodcat.apnumber 
           ORDER BY aptitle ASC";
  $result2 = mysql_query($sql2);
  $ordernum=1;

  while ($order = mysql_fetch_array ($result2)) {
    $sql3 = "UPDATE poster_prodcat SET catorder='$ordernum' 
             WHERE apnumber='$order[apnumber]' AND apcatnum='$cats[apcatnum]'";
    $result3 = mysql_query($sql3);
    $ordernum++;
    }
  }

Это на 2-гигабитном сервере, на котором также размещается сайт.Время ожидания велико, и сервер не падает, поэтому я не вижу, что мешает ему завершить работу.Могу ли я сделать это на этом сервере, или, поскольку это операция раз в месяц или около того, я должен просто создать какой-нибудь большой экземпляр памяти EC2, выполнить сортировку и загрузить загруженные таблицы?

Спасибо.

Вот структура poster_data (с некоторыми удаленными полями, которые не участвуют в выборках):

CREATE  TABLE  `poster_data` (
`apnumber` mediumint( 8  )  NOT  NULL DEFAULT  '0',
`aptitle` varchar( 255  )  NOT  NULL DEFAULT  '',
`aptype` varchar( 100 ) NOT NULL DEFAULT '',
[snip]
UNIQUE  KEY  `posterid` (  `apnumber`  ) ,
KEY  `aptitle` (  `aptitle`  ) ,
KEY  `aptype` (  `aptype`  ) ,
KEY  `title_type` (  `aptitle` ,  `aptype`  )  ) ENGINE  = InnoDB;

poster_prodcat:

CREATE TABLE `poster_prodcat` (
`apcatnum` mediumint( 8 ) NOT NULL DEFAULT '0',
`apnumber` mediumint( 8 ) NOT NULL DEFAULT '0',
`catorder` mediumint( 7 ) NOT NULL DEFAULT '0',
PRIMARY KEY ( `apcatnum` , `apnumber` ) ,
KEY `apcatnum` ( `apcatnum` ) ,
KEY `apnumber` ( `apnumber` ) ,
KEY `catorder` ( `catorder` )
) ENGINE = InnoDB /*!50100 PARTITION BY HASH (apcatnum) PARTITIONS 10 */;

1 Ответ

0 голосов
/ 12 мая 2011
  while ($order = mysql_fetch_array ($result2)) {
    $sql3 = "UPDATE poster_prodcat SET catorder='$ordernum' 
             WHERE apnumber='$order[apnumber]' AND apcatnum='$cats[apcatnum]'";
    $result3 = mysql_query($sql3);
    $ordernum++;
    }
  }

Значит ли это, что вы выполняете 17 миллионов отдельных транзакций? Если вы можете выдержать тысячу транзакций в секунду, одна эта часть займет около 5 часов, верно?

Википедия (легкодоступная, но не та, которую я считаю авторитетной) говорит об транзакциях innodb .

При работе в полностью совместимом с ACID режимы, InnoDB должен сделать сброс на диск хотя бы один раз за транзакцию, хотя он объединит флеши для вставок из нескольких соединений. Для типичного вращающиеся жесткие диски или массивы, это будет налагать ограничение около 200 обновлять транзакции в секунду.

...