免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2250 | 回复: 5
打印 上一主题 下一主题

求助php代码:处理大量mysql表记录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-15 11:38 |只看该作者 |倒序浏览
求教php代码:

有一mysql表user(user_id),共100万记录

求每一个user_id同本表中的其它50个user_id随机配对,将结果插入一个新表,user_new(user_id,user_friend_id),共5000万个记录。


谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-01-15 12:38 |只看该作者
配对出来,写成
user_id,user_friend_id
user_id,user_friend_id
user_id,user_friend_id
... ...
这样的一个文本文件中,5000万行的
然后用mysql的load data local infile语句将其一次导入到新表中。

论坛徽章:
0
3 [报告]
发表于 2009-01-15 18:50 |只看该作者
谢谢二楼的提醒。代码如下:<?php

<?php

if ($conn=@mysql_connect("localhost","user","password"))
{
mysql_select_db("test");

$i = 0;
while ($i <= 1000000){

$sql = "select user_id from users limit ";
$sql.= "$i";
$sql.= ",1000;";

echo $sql;

$query = mysql_query($sql);

while ($row = mysql_fetch_assoc($query))
{
$user_data_array[] = $row['user_id'];
}

$new_array = array();

foreach ($user_data_array as $uid)
{
$new_array[$uid] = array();
while (count($new_array[$uid])<50)
  {
  $rand_userid_key = array_rand($user_data_array);
  $rand_userid = $user_data_array[$rand_userid_key];
  if ($rand_userid!=$uid && !in_array($rand_userid, $new_array[$uid]))
   {
   $new_array[$uid][] = $rand_userid;
   }
  }
}

$str = "insert into user_new(user_id, user_friend_id) values";
foreach ($new_array as $uid=>$v)
{
foreach ($v as $partnerid)
{
$str .= "($uid, $partnerid),";
}
}

$sql_insert = substr($str,0, -1);


$hd = fopen('/tmp/data.txt', 'a+');

fwrite($hd, $sql_insert);

// fcolse($hd);

$i=$i+1000;

}

mysql_close();
}
else
{
printf("<p>can't connect DB! %s</p> \n",
mysql_error());

}

?>


但是,测试结果很慢。
有朋友说是因为array不适合。对PHP不熟悉,还请诸位多指点,谢谢。

论坛徽章:
0
4 [报告]
发表于 2009-01-16 09:42 |只看该作者
上面的代码,一晚上都没有跑完。
有没有替代array,更高效的办法呢?

论坛徽章:
0
5 [报告]
发表于 2009-01-16 09:48 |只看该作者
建议你用个简单输出拼出一个大的sql文件,然后导入

用代码能跑完就很不错了。。。

论坛徽章:
0
6 [报告]
发表于 2009-01-16 13:28 |只看该作者
问题基本解决,5分钟可完成。
修改后的代码:
<?php

if ($conn=@mysql_connect("localhost","user","password"))
{
mysql_select_db("test");

$i = 0;
while ($i <= 1000000){

$user_data_array =array();

$sql = "select user_id from users limit ";
$sql.= "$i";
$sql.= ",1000;";

echo $sql;

$query = mysql_query($sql);

while ($row = mysql_fetch_assoc($query))
{
$user_data_array[] = $row['user_id'];
}

$new_array = array();

foreach ($user_data_array as $uid)
{
$new_array[$uid] = array();
while (count($new_array[$uid])<50)
  {
  $rand_userid_key = array_rand($user_data_array);
  $rand_userid = $user_data_array[$rand_userid_key];
  if ($rand_userid!=$uid && !in_array($rand_userid, $new_array[$uid]))
   {
   $new_array[$uid][] = $rand_userid;
   }
  }
}

$str = "insert into user_new(user_id, user_friend_id) values";
foreach ($new_array as $uid=>$v)
{
foreach ($v as $partnerid)
{
$str .= "($uid, $partnerid),";
}
}

$sql_insert = substr($str,0, -1);


$hd = fopen('/tmp/data.txt', 'a+');

fwrite($hd, $sql_insert);


$i=$i+1000;

}
fcolse($hd);
mysql_close();

}
else
{
printf("<p>can't connect DB! %s</p> \n",
mysql_error());

}

?>

[ 本帖最后由 r_a 于 2009-1-16 13:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP