Php 在mysql数据库中保存股票报价太慢
目前,我正试图通过加载雅虎的csv文件来保存股票数据。我创建了一个名为stocks with的数据库,它将纳斯达克/纽约证券交易所/美国证券交易所的股票代码作为表格(大约6,5k个表格)组成。 问题是我得到的数据保存时间太长了。 我想在1分钟内加载并保存数据。装载大约需要30秒,节省大约3分钟。我必须减少节省时间。 以下是我为获取和保存数据而编写的脚本:Php 在mysql数据库中保存股票报价太慢,php,mysql,csv,stockquotes,Php,Mysql,Csv,Stockquotes,目前,我正试图通过加载雅虎的csv文件来保存股票数据。我创建了一个名为stocks with的数据库,它将纳斯达克/纽约证券交易所/美国证券交易所的股票代码作为表格(大约6,5k个表格)组成。 问题是我得到的数据保存时间太长了。 我想在1分钟内加载并保存数据。装载大约需要30秒,节省大约3分钟。我必须减少节省时间。 以下是我为获取和保存数据而编写的脚本: include('mysql_connect.php'); $ticker=array(); $db="stocks"; $res=
include('mysql_connect.php');
$ticker=array();
$db="stocks";
$res=mysql_query("SHOW TABLES FROM $db");
while($row=mysql_fetch_array($res,MYSQL_NUM)){
$ticker[]=$row[0];
}
$ticker_length=count($ticker);
$steps=floor($ticker_length/200);
for($j=0;$j<=$steps;$j++){
$ticker_url="";
if($j<$steps){
for($i=$j*200;$i<($j+1)*200;$i++){
if($i==(($j+1)*200)-1){
$ticker_url=$ticker_url.$ticker[$i];
}else{
$ticker_url=$ticker_url.$ticker[$i]."+";
}
}
$url="http://finance.yahoo.com/d/quotes.csv?s='$ticker_url'&f=snxab2l1va2p2opm3m4ghd1t1=.csv";
$filehandle=fopen("$url","r");
while(!feof($filehandle)){
$line=fgetcsv($filehandle,1024);
if( $line[0]=="" || $line[0]==null || !isset($line[0]) ){
//echo"Leer<br/>";
}else{
$Symbol=strtolower($line[0]);
$Name=$line[1];
$LastTradePriceOnly=$line[5];
$Volume=$line[6];
$query=mysql_query("INSERT INTO $Symbol(symbol,Name,LastTradePriceOnly,Volume)
VALUES('$Symbol','$Name','$LastTradePriceOnly','$Volume')");
}
}
fclose($filehandle);
}else{
for($i=$j*200;$i<$ticker_length;$i++){
if($i==$ticker_length-1){
$ticker_url=$ticker_url.$ticker[$i];
}else{
$ticker_url=$ticker_url.$ticker[$i]."+";
}
}
$url="http://finance.yahoo.com/d/quotes.csv?s='$ticker_url'&f=snxab2l1va2p2opm3m4ghd1t1=.csv";
$filehandle=fopen("$url","r");
while(!feof($filehandle)){
$line=fgetcsv($filehandle,1024);
if( $line[0]=="" || $line[0]==null || !isset($line[0]) ){
//echo"empty<br/>";
}else{
$Symbol=strtolower($line[0]);
$Name=$line[1];
$LastTradePriceOnly=$line[5];
$Volume=$line[6];
$query=mysql_query("INSERT INTO $Symbol(symbol,Name,LastTradePriceOnly,Volume)
VALUES('$Symbol','$Name','$LastTradePriceOnly','$Volume')");
}
}
fclose($filehandle);
}
}
include('mysql_connect.php');
$ticker=array();
$db=“股票”;
$res=mysql_查询(“显示$db中的表”);
而($row=mysql\u fetch\u数组($res,mysql\u NUM)){
$ticker[]=$row[0];
}
$ticker\u length=计数($ticker);
$steps=地板($ticker_length/200);
对于($j=0;$j我找到了解决方案。Mysql允许您从csv保存行和列,而无需读取复杂循环中的行:
$url = "http://finance.yahoo.com/d/quotes.csv?s=AAPL+MSFT+GOOG&f=...the datas you need=.csv";
$sql = "LOAD DATA LOCAL INFILE '" . $url . "'
INTO TABLE `" . $data_tablename . "`
FIELDS
TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES
TERMINATED BY '\n'
(`your_cols`,``,.....)";
mysql_query($sql)or die(mysql_error());
我的脚本在服务器上花了我250秒,但现在只花了45秒。惊人的时间利润…1个表对应每个股票代码名?6.5K个表?这太疯狂了。为什么不将所有内容存储到一个表中,包含一个股票代码名列?要像这样批量插入,你肯定应该使用准备好的语句。看,这会很慢。你必须数千个表和你的表正在循环中插入行!我想把股票的刻度放在一个表中,这样一切都会更好地组织起来…我想如果所有的数据都放在一个表中,检索数据会很慢。我对mysql不太感兴趣。我会读一些准备好的语句。谢谢你的简短课程。