php 求一段代码优化

lonelyriver 2009-07-22 12:07:41
    for ($i=0;$i<count($listarray2);$i++) {  //$listarray2有1700多条数据
$explist = explode("\t",$listarray2[$i]); //以空格分隔,填入$explist数组。
$sql ="insert into stock_trade_list (StockID,StockName,upRange,currentPrice,totalHand,areHand,leftClose,opening,highest,minimun,callToBuy,peddle,speedUp,compareNumber,earnings,cityNet,volumeBuying,volumesold,commissioned,amplitude,changingHands,changeRange,amount,amountOfbothT,numberof,handPerT,outside,within,totalMarketValue,flowOfValue,contribute,insertTime) values ('".$explist[0]."','".$explist[1]."','".$explist[3]."','".$explist[4]."','".$explist[5]."','".$explist[6]."','".$explist[7]."','".$explist[8]."','".$explist[9]."','".$explist[10]."','".$explist[11]."','".$explist[12]."','".$explist[13]."','".$explist[14]."','".$explist[15]."','".$explist[16]."','".$explist[17]."','".$explist[18]."','".$explist[19]."','".$explist[20]."','".$explist[21]."','".$explist[22]."','".$explist[23]."','".$explist[24]."','".$explist[25]."','".$explist[26]."','".$explist[27]."','".$explist[28]."','".$explist[29]."','".$explist[30]."','".$explist[31]."',now());";
mysql_query($sql) or die("Query failed :" . mysql_error());
}

每当运行到这个循环(1700多次),机器就会变的很卡。我的写法有点笨 ,有没什么可优化的呀??谢谢啦
...全文
244 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonelyriver 2009-09-01
  • 打赏
  • 举报
回复
sorry 隔了这么多天才来揭帖
hz112111 2009-08-13
  • 打赏
  • 举报
回复
使用预处理,对于执行相同类似数据库操作可以提升很大
YHL27 2009-08-03
  • 打赏
  • 举报
回复
sf!!
wang913com 2009-07-30
  • 打赏
  • 举报
回复
出了count($listarray2);先算好外 ,可以考虑foreach循环, 这个比for循环要快
yctin 2009-07-24
  • 打赏
  • 举报
回复
我那段代码是随便写的, 很多地方错
你那种格式其实直接fputcsv()再LOAD DATA 就可以了
而且可能你的数据源本身就是CSV
jim8590251 2009-07-24
  • 打赏
  • 举报
回复
学习了,CSDN高手如云啊!
tfxg 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yctin 的回复:]
PHP code$filename=microtime(true).'.sql';if (false!== ($handle=fopen($filename,'x'))) {foreach ($listarray2as$row) {$explist=explode("\t",$row);unset($explist[2]);$sql="insert into stock_trade_list (S¡­
[/Quote]

支持此方法,另
先將要執行的腳本生成然後一次性執行完
Gdj 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lonelyriver 的回复:]
这个 ($sql?",":"").
啥意思呢 ?三目运算?
[/Quote]

对,三目运算
fsy123456accp 2009-07-23
  • 打赏
  • 举报
回复
偶不懂 mysql 也来 顶一下
ttm1984 2009-07-23
  • 打赏
  • 举报
回复
生成一个临时的SQL文件,执行完成后删除。
lonelyriver 2009-07-23
  • 打赏
  • 举报
回复
没人来关注啦?
「已注销」 2009-07-22
  • 打赏
  • 举报
回复
将数据分割成数组,写个arrayToInsertSql的函数,采用 insert values (....), (......), (.....)的形式插入
dhgdmw 2009-07-22
  • 打赏
  • 举报
回复
生成文件或文件字符再导入
fenyao 2009-07-22
  • 打赏
  • 举报
回复
5楼好办法!
6楼办法也不错,load data infile ...
结合6楼的办法,也可以用mysql的source命令来执行生成的sql文件,速度很快的
yctin 2009-07-22
  • 打赏
  • 举报
回复

$filename = microtime(true).'.sql';

if (false !== ($handle = fopen($filename, 'x'))) {

foreach ($listarray2 as $row) {
$explist = explode("\t",$row);
unset($explist[2]);

$sql ="insert into stock_trade_list (StockID,StockName,upRange,currentPrice,totalHand,areHand,leftClose,opening,highest,minimun,callToBuy,peddle,speedUp,compareNumber,earnings,cityNet,volumeBuying,volumesold,commissioned,amplitude,changingHands,changeRange,amount,amountOfbothT,numberof,handPerT,outside,within,totalMarketValue,flowOfValue,contribute,insertTime) values ('".implode("','",$explist)."',now());";

fwrite($handle, $sql.PHP_EOL);
}
fclose($handle);

$sql = 'LOAD DATA INFILE "'.realpath($filename).'" INTO TABLE stock_trade_list';
mysql_query($sql) or die("Query failed :" . mysql_error());

unlink($filename);

} else {
echo "The file $filename is not writable or cannot open.";
}
Gdj 2009-07-22
  • 打赏
  • 举报
回复
1.将数据以一条语句的形式插入
$sql="";
for ($i=0;$i<count($listarray2);$i++) { //$listarray2有1700多条数据
$explist = explode("\t",$listarray2[$i]); //以空格分隔,填入$explist数组。
$sql.=($sql?",":"")."('".$explist[0]."','".$explist[1]."','".$explist[3]."','".$explist[4]."','".$explist[5]."','".$explist[6]."','".$explist[7]."','".$explist[8]."','".$explist[9]."','".$explist[10]."','".$explist[11]."','".$explist[12]."','".$explist[13]."','".$explist[14]."','".$explist[15]."','".$explist[16]."','".$explist[17]."','".$explist[18]."','".$explist[19]."','".$explist[20]."','".$explist[21]."','".$explist[22]."','".$explist[23]."','".$explist[24]."','".$explist[25]."','".$explist[26]."','".$explist[27]."','".$explist[28]."','".$explist[29]."','".$explist[30]."','".$explist[31]."',now());";
}
mysql_query("insert into (StockID,StockName,upRange,currentPrice,totalHand,areHand,leftClose,opening,highest,minimun,callToBuy,peddle,speedUp,compareNumber,earnings,cityNet,volumeBuying,volumesold,commissioned,amplitude,changingHands,changeRange,amount,amountOfbothT,numberof,handPerT,outside,within,totalMarketValue,flowOfValue,contribute,insertTime) values ".$sql) or die("Query failed :" . mysql_error());


2.如果不要求数据立即生效的话。插入大量数据时使用INSERT DELAYED INTO ...可以极大提高性能。
lonelyriver 2009-07-22
  • 打赏
  • 举报
回复
1.count($listarray2)在循环外计算:
——不错 这个提议很好.
hzcenter 2009-07-22
  • 打赏
  • 举报
回复
应该可以用mysql的load来在直接插入数据。

具体怎样,看看手册!
blueforyou 2009-07-22
  • 打赏
  • 举报
回复
1.count($listarray2)在循环外计算:
比如$count=count($listarray2);
for ($i=0;$i<$count;$i++)... 这样可以少执行1700多次count运算.
2.推荐拼装数组时不按"\t”,而按",",插入数据时就可以少了这一步分隔又拼写
3.楼上兄弟的方法可以尝试下
lonelyriver 2009-07-22
  • 打赏
  • 举报
回复
六楼的 $filename = microtime(true).'.sql';
啥意思呀 microtime(true)返回的不是个时间戳吗?在这里有什么用处?
加载更多回复(2)

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧