微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大型数据集的排序无法完成

如何解决大型数据集的排序无法完成

| 这是调试PHPMysqL插入失败的后续操作,因为我现在有时间继续该项目。 我在此问题中有三个表: poster_data中有840,721个海报 poster_categories中的58,506个海报类别 Poster_prodcat中的17,629,007(1,700万+)个海报/类别组合 基于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 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;
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 */;
    

解决方法

  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万笔独立交易?如果您每秒可以维持一千笔交易,那么仅这部分就需要大约5个小时,对吗? 维基百科(现成可用,但我认为不是权威的)就innodb事务表示了这一点。   在完全兼容ACID的情况下运行   模式,InnoDB必须刷新磁盘   每笔交易至少一次   它将结合冲洗插入   来自多个连接。对于典型   旋转硬盘驱动器或阵列   将施加约200个限制   每秒更新交易。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。