0

さて、以下のphpコードは、フィールド内のすべての行を正常に追加しurlます.

$sql = "SELECT * FROM table WHERE url <> ''";
$result = mysql_query($sql,$con);
$sql_num = mysql_num_rows($result);

while($sql_row=mysql_fetch_array($result)) 
{
    urls[] = $sql_row["url"];
}

問題は、URL のリストが数百万の場合、(特に localhost で) 時間がかかることです。したがって、ループを使用せずにSQLクエリの結果を直接配列に取得する別の方法を知りたいです。出来ますか?

4

4 に答える 4

1

そのためには mysqli の使用を検討する必要があります。fetch_all()メソッドはそれを可能にします。

http://php.net/manual/en/mysqli-result.fetch-all.php

アップデート

コメントによると、私は両方の方法を試しました。本番環境にある大きなテーブルでmysql_fetch_array、ループとメソッドを使用してみました。より少ないメモリを使用し、ループよりも高速に実行されました。mysqli::fetch_all()mysqli::fetch_all()mysql_fetch_array

テーブルには約 500000 行あります。mysqli::fetch_all()2.50 秒で配列へのデータの読み込みを完了し、スクリプトで設定された 1G のメモリ制限に達しませんでした。mysql_fetch_array()3.45 秒後にメモリ不足で失敗しました。

于 2012-07-20T14:34:51.680 に答える
1

問題はループではなく、何百万ものデータ (おそらく大きい) をデータベースからメモリに転送していることです。どの方法でやっても時間がかかります。とにかく誰かがどこかでループする必要があります。

つまり、データベースから取得するデータの量を減らします。

于 2012-07-20T14:35:09.430 に答える
0

mysqlは非推奨であり、必要な機能は および にmysqliありPDOます。これは、新しい MySQL 拡張機能に切り替えるのに最適な言い訳です。mysqliとの両方のPDO場合、方法は次のとおりです (を実行するにはドライバが必要であるfetchAllことに注意してください)。mysqli::fetch_allmysqlnd

于 2012-07-20T14:35:59.040 に答える
0

mysql にはオプションがありません。ただし、pdo の fetchall() を使用できます

http://php.net/pdostatement.fetchall

于 2012-07-20T14:36:23.430 に答える