以下は、mysqlデータをフェッチするためにほとんどのPHPコードで一般的に使用される2つの方法です。
mysql_fetch_array()
mysql_fetch_assoc()
今、私は大きなデータベースを持っています。ループ(while
)でデータをフェッチする場合、何が速くて良いですか?
このベンチマーク が見つかりました。
どちらを選びますか?
例に示されているベンチマークは、引数なしでmysql_fetch_array()を使用してMYSQL_ASSOCまたはMYSQL_NUMを指定しているため、デフォルトでMYSQL_BOTHに設定されています。だから私はそれが有効なベンチマークではないことをお勧めします。
実際には、MYSQL_ASSOCを使用したmysql_fetch_array()とmysql_fetch_assoc()を区別する必要はほとんどないはずです。そして、それは間違いなくスクリプトの最大のオーバーヘッドにはなりません。
私はfetch_assocを好みます。 「python辞書のような) "連想配列"を返します。これは、配列が文字列(通常の場合)でインデックス付けされることを意味します。
Fetch_arrayのデフォルトでは、番号付きインデックスと連想インデックスの両方が提供されます。
しかし、私は番号付けされたインデックスを決して使用しないので、fetch_assocを使用して少し速くするのが好きです
これはmysql_fetch_array()の結果です
$row['fieldname'] = 'some value';
または
$row[0] = some value';
これはmysql_fetch_assoc()の結果です。
$row['fieldname'] = 'some value';
この場合、クエリ結果の「サイズ」は重要ではありません。
mysql_fetch_array()
は通常、連想配列plusのインデックス付き結果を返すことでオーバーヘッドを生成します。
クエリのタイプと、mysql_fetch_array()
を使用するかmysql_fetch_assoc()
を使用するかについて望ましい結果を決定する必要があります。
オーバーヘッドが「無視できる」であり、クエリが成功し、結果が1つしかないことがわかっている場合は、時々次のようにします。
_$q = mysql_query('SELECT `column1`,`column2` FROM `table` WHERE `id` = 123');
list($column1,$column2) = mysql_fetch_array($q);
mysql_free_result($q);
_
繰り返し処理(while
ループなど)の場合、これはそれをカットしません。 「list
演算子を使用して」「迅速に抽出」する結果が必要なく、結果をコードでさらに処理する必要がある場合は、常にmysql_fetch_assoc()
*を使用します。
*実際に強制される場合usePHPの非常に古い手続き型データ検索関数。 代替案があります 。
心に留めておくべき追加の点は、fetch_assoc()
が期待するすべての列を返すとは限らないことです。 2つの出力列が同じ名前を持つ場合、その列の最後のインスタンスのみがfetch_assoc()
によって取得されます。たとえば、次のクエリ:
SELECT * FROM orders LEFT JOIN line_items ON orders.id = line_items.order_id
両方のテーブルにid
という列があるとすると、結果の連想配列にはid
というキーがあり、その値はline_items.id
に設定されているため、結果からorders.id
を取得できません。
SELECT
列に手動でエイリアスを付け、各列に一意のエイリアスを与えることで、この重複する列名の問題を回避し、fetch_assoc()
を引き続き使用できます。
SELECT
o.id AS order_id, #unique alias
i.id AS line_item_id, #unique alias
o.date,
i.qty,
i.price
FROM orders o
LEFT JOIN line_items i ON i.order_id = o.id
または、fetch_array()
の使用に切り替えることができます。これにより、キーではなくインデックスでid
にアクセスできます。
まあ http://php.net/manual/en/function.mysql-fetch-assoc.php 状態
注:パフォーマンス
注意すべき重要な点は、mysql_fetch_assoc()を使用してもmysql_fetch_row()を使用するよりも大幅に遅くなることはありませんが、重要な付加価値を提供します。
したがって、違いは心配する必要はありません。
mysql_fetch_array()とmysql_fetch_assoc()
mysql_fetch_array():フェッチされた行に対応する配列を返し、内部データポインターを先に移動します。 詳細なドキュメントについては、こちらをクリックしてください! mysql_fetch_assoc():オプションの2番目のパラメーターでMYSQL_ASSOCを指定してmysql_fetch_array()を呼び出すのと同じです。連想配列のみを返します。
mysql_fetch_assoc()
がおそらくより良い選択です。わずかなパフォーマンスヒットがあります(mysql拡張は列名を検索する必要がありますが、行がいくつあっても1回だけ発生するはずです)が、代わりにmysql_fetch_array()
を使用することを正当化するには不十分です。 mysql_fetch_array()
は、列を1つだけ選択する場合に役立ちます。
それはあなたの大きな定義に依存すると思います。そのベンチマークから、実際に測定可能な差を得るのは、100万以上のフェッチを実行する前にのみであることがわかりますか?データベースはそれほど大きいですか?そうでない場合は、より使いやすいもの(おそらく連想配列をフェッチすること)を使用してください。
考慮すべきもう1つの点は、それが大きすぎて測定可能な違いがある場合は、そのような関数をすべて一緒に使用する方法を得ることになります。 MySQLiを使用するか、PDOを使用することを検討してください!