0

150000行を超える数値を持つ2つのテーブルがあり、次のコードがあります。

$q=$_GET["q"];
$negative = strlen($q);
$reverse = strrev($q);
while ($a = mysql_fetch_array($sql)) {
if (strlen($q) > 0)
  {
  $hint="";
  for($i=0; $i<count($a); $i++)
    {
    if ($reverse==substr($a[$i],-$negative,strlen($q)))
      {
      if ($hint=="")
        {
        $hint=$a[$i];
        }
      }
    }
  }
echo $hint . "\t";
}

このクエリは結果を返すのに27秒かかり、すべての結果をシャッフルしたかったのですが、shuffle()関数を追加すると次のようになります。

while ($a = mysql_fetch_array($sql)) {
shuffle($a);

パフォーマンスは驚くほど変化し、結果を返すのに2秒しかかからず、同じことを何度も試しました。速くなりますか?

4

2 に答える 2

4

mysql_fetch_array数値キーと文字列キーの両方を含む配列を返すため、連想配列であり、すべてのルックアップにハッシュが必要です。shuffleすべてのキーを破棄し、より効率的にアクセスできるインデックス付き配列に変換します。

これを行うと、シャッフルされた行には、返される列ごとに2つの要素があります。1つは数字キーからのもので、もう1つは名前付きキーからのものです。mysql_fetch_rowまたはを使用mysql_fetch_array($sql, MYSQL_NUM)して、この問題を防ぐ必要があります。これを行うと、シャッフルなしのコードも高速になります。

于 2012-08-16T09:33:34.717 に答える
1

間違いなくそうではありません。SQLサーバーが結果をキャッシュした可能性が高いため、2回目は高速になります。

于 2012-08-16T09:17:23.000 に答える