1

私の問題は次のとおりです。文字列を含む同じ長さの2 つの配列が$firstあります。$secondという名前のテーブルで、すべての文字列に正の値が与えられますFullhandvalues

Field: board : string(7) PRIMARY KEY
Field: value : int (11)

$first[$i] が $second[$i] よりも良い値を持つ回数、同じ値を持つ回数、$first[$i] が $ より悪い値を持つ回数を数えたい秒[$i]。

私が今やったことは、経由ですべての値を取得することです

$values[0]= DB::table('Fullhandvalues')->where_in("board",$first)->get(Array("value"));
$values[1]= DB::table('Fullhandvalues')->where_in("board",$second)->get(Array("value"));

そして値を比較します。しかし、これは非常に遅いようです (配列の長さが 5000 で、テーブル内のエントリが 50000 の場合、約 6 秒)。

よろしくお願いします

編集:それらをループする方法:

$win=0;$lose=0;$tie=0;
for($i=0;$i<count($values[0]);$i++)
    {
        if ($values[0][$i]>$values[1][$i])
            $win++;
        elseif ($values[0][$i]<$values[1][$i])
            $lose++;
        else $tie++;
    }
4

1 に答える 1

1

あなたの問題はwhere_in. implode(',', $second)あなたは基本的に(プラス変更)の長さでクエリを構築しています。これは、最初に Laravel (PHP) によって生成され、次に DBMS によって分析される必要があります。

また、生成されたクエリはIN(...)式を使用しますが、これは MySQL で遅いことが知られています。

アプリケーションとボード ID の選択方法に関する詳細情報がなくても、次のオプションがあります。

  • 一時テーブルを作成し、配列データを入力します (これは非常に高速ですが、できればこのデータはデータベースに既に存在している必要があります)。
  • 一時テーブルにインデックスを作成することを忘れないでください。
  • インナーで選ぶjoin
于 2013-02-11T08:57:46.267 に答える