次の形式のデータが最大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 "" ""
上記のデータセットはデータの基本的なサンプルです。実際には、それぞれ50以上のデータ項目(約100,000行)と年間データである約140列のデータを持つ2000を超える製品があります。
データベースで各データ項目(つまり、各行)を検索し、各データ項目の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クエリを回避しますが、「メモリ不足」の制限に達します。
より良い方法が必要です...