大型数据集排序失败


Sorting of large dataset fails to complete

这是在php中调试mysql插入失败的后续操作,因为我现在有时间继续该项目。

这个问题我有三张表:
张贴840721张海报_数据
58506海报类别在poster_categories中
17629007(1700万以上(海报/类别组合在poster_docat 中

基于雅虎的高效寻呼演示!,我试图在posteri_prodcat中添加一个类别排名号,这样我们就可以按排名进行分页,而不是使用限制和偏移。尽管将我的php-mysql连接超时设置为3600(我知道这太疯狂了(,并关闭了php超时,但订单似乎从未完成。也许几十到十万左右,但从来没有完整的17000000套。

这是脚本:

$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 gig服务器上,该服务器也托管该网站。超时时间很长,服务器没有崩溃,所以我看不出是什么阻止了它完成。我可以在这台服务器上做这件事吗?或者因为这是一个月一次的操作,我应该创建一些大内存的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;

posteri_proccat:

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 */;
  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++;
    }
  }

这是否意味着你正在执行1700万笔单独的交易?如果你能维持每秒1000笔交易,仅这一部分就需要大约5个小时,对吧?

维基百科(很容易获得,但不是我认为的权威(这样描述innodb交易。

在完全符合ACID的条件下运行时模式下,InnoDB必须对磁盘进行刷新不过,每笔交易至少一次它将组合插入的刷新来自多个连接。对于典型旋转硬盘驱动器或阵列,这将施加约200的限制每秒更新事务。