2016-08-21 4 views
1

テーブルarsehはすべてのフィールドがプライマリキーであるテーブルがあります。すべてのフィールドにはインデックスがあります。それは10,000,000レコードを持っています。テーブルから10,000回以上選択する

 
     Arseh Table 
------------------------------ 
|Code|ID|FromYear|ToYear| 
----------------------------- 
|1 |1 |1350 |1395 | 
|2 |1 |1355 |1366 | 
|2 |10|1395 |1395 | 

PHPは

function Calc($Code,$ID,$FromYear,$ToYear){ 
    $Handler = new DB(); 
    $Result=$Handler->query("select * from arseh where Code='".$Code."' and ID=".$ID." and FromYear='".$FromYear."' and ToYear='".$ToYear."'"); 
    return $Result; 
} 

私は違うとランダムパラメータを持つ万回以上の関数のCalcを呼び出す必要があります。

問題:このシナリオ(Calcを10,000回呼び出す)には20秒かかることがあります。この時間をどのように減らすことができますか?

テーブルの配列全体のデータを配列に一度に挿入し、配列内で他の時間を検索するのではなく、テーブルから選択する方が良いですか?

+0

テーブルのインデックスはどのようになっていますか? –

+1

DBは呼び出されるたびに新しいデータベース接続を作成しますか?すでに設定されている場合は既存のデータベース接続を使用しますか? –

+0

すべてのフィールドにインデックス – ashkufaraz

答えて

1

クエリ時間内に必要なデータを予測し、はるかに小さなデータを読み込むことができます。 しかし、もう1つの方法は、私がここで説明する索引検索です。

最初にすべてのデータをロードし、グローバル変数に保存します。

FromYearの2つの配列を作成し、そのインデックスをFromYear値に設定し、もう1つをToYearに設定し、インデックスをToYearに設定し、両方の値をデータインデックスに設定します。

次に、ToYearとFromYearの配列をインデックスと必要に応じてフィルタリングします。

次に結果値を交差させます。

次に結果インデックスを使用し、それらを選択して戻り値を返します。

次に例を挙げて説明します...

0

これは典型的なN + 1クエリの問題(google it)です。各反復でCalc()を呼び出すサイクルがあり、膨大な量のSELECTを作成します。

適切な手法は、(10000の組み合わせを挙げて)パラメータをグループ化し、1つのクエリでそれらを読み込むことです。このようにして、比較的小さなデータセットになり、マッチングがより安くなります。

+0

関数Calc()のパラメータについてはわかりませんが、これらのパラメータはランダムです – ashkufaraz

+0

データベースや他のソースからパラメータを受け取ったということは、 10000回の反復を実行する前にしたがって、Calc()の反復と呼び出しの代わりに、データを最初にロードする必要があります。 –

+0

良いアイデアバディ感謝のおかげで;) – MSS

関連する問題