我有一个包含 ~100000 行和 ~150 列数据的数据库,格式如下:
data_id data_name monthly_data1 monthly_data2 monthly_data3 "" ""
0 product1_data-item1 20 30 10 "" ""
1 product1 data-item2 10 30 20 "" ""
2 product1 data-item3 9 10 23 "" ""
3 product2 data-item1 40 13 12 "" ""
4 product2 data-item2 31 12 32 "" ""
5 product2 data-item3 23 49 23 "" ""
上面的数据集是数据的基本样本,实际上有超过 2000 个产品,每个产品有 50+ 个数据项(约 100,000 行)和约 140 列数据,即年度数据。
我需要在数据库中搜索每个数据项 - 每个产品(即每一行),并确定每个数据项的 month_data1 到 month_data140 列中的值是否在该特定数据项的预定最小/最大范围内.
这是我的代码格式,它正在运行,只是非常缓慢,大约需要 20 秒才能完成每年对每种产品的所有 50 次检查。
$numberProducts = 2000;
$numberLineItems = 50;
$numberMonths = 140;
for($m=0;$m<$numberMonths;$m++){
for($p=0;$p$numberProducts;$p++){
$dataMonth = 'data_month'.$m+1;
$q="SELECT $dataMonth FROM product_table WHERE data_id='".($p*$numberLineItems)."'";
$q=mysql_query($q);
while($row=mysql_fetch_assoc($q)){
$dataVal = $row[$dataMonth];
}
mysql_free_result($q);
if(($dataVal>=$dataMin1)&&($dataVal<=$dataMax1)){
$q="SELECT $dataMonth FROM product_table WHERE data_id='".($p*$numberLineItems+1)."'";
$q=mysql_query($q);
while($row=mysql_fetch_assoc($q)){
$dataVal = $row[$dataMonth];
}
mysql_free_result($q);
if(($dataVal>=$dataMin2)&&($dataVal<=$dataMax2)){
$q="SELECT $dataMonth FROM product_table WHERE data_id='".($p*$numberLineItems+2)."'";
$q=mysql_query($q);
while($row=mysql_fetch_assoc($q)){
$dataVal = $row[$dataMonth];
}
mysql_free_result($q);
if(($dataVal>=$dataMin3)&&($dataVal<=$dataMax3)){
.
.
.
等等。一直到每个产品每个月的第 50 个数据项,检查该产品的该数据项的月值是否在预定范围内 --- 预定范围(dataMin/dataMax)不同每个产品的每个单独的数据项,但产品之间的每个特定数据项相同。
我正在寻找一种方法来加速代码、不同的查询组合、服务器设置、循环样式等,这可能有助于优化事情并缩短输出所需的几秒钟。任何想法,将不胜感激。
我的第一个想法是更改 select 语句以选择整个数据库 $q = "SELECT * FROM product_table"; 并将数据放入多维数组中以进行最小/最大检查并避免 14,000,000 次查询,但我遇到了“内存不足”限制。
必须有更好的方法...