PHPでMySQLデータベースを使用する場合、クエリ結果からデータを抽出する必要があることがよくあります。 mysqli_result :: fetch_assocとmysqli_fetch_rowは、クエリ結果行データを取得するために一般的に使用される2つの方法です。それらはすべてクエリ結果セットを返すことができますが、パフォーマンス、返品値形式、および適用可能なシナリオが異なります。この記事では、2つのパフォーマンスの違いを調査し、それぞれの特性を分析し、大規模なデータボリュームを照会する際にどの方法がより適しているかを議論します。
mysqli_result :: fetch_assoc :
fetch_assocメソッドは連想配列を返します。ここで、配列のキーは列名で、値は対応する列の値です。通常、このアプローチは、列名を介して結果のデータに直接アクセスできるため、理解して使用しやすくなります。
例:
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">" - Name: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] . </span><span><span class="hljs-string">"<br>"</span></span><span>;
}
</span></span> mysqli_fetch_row :
fetch_rowメソッドは、数値インデックスのインデックス付き配列を返します。つまり、列値は、クエリ結果にある順序で数値インデックスに配置されます。この方法は、列名との関連を作成する必要がないため、 fetch_assocよりもわずかに効率的です。
例:
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_row</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>] . </span><span><span class="hljs-string">" - Name: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>] . </span><span><span class="hljs-string">"<br>"</span></span><span>;
}
</span></span>パフォーマンスに関しては、 mysqli_fetch_rowは通常、 mysqli_result :: fetch_assocよりもメモリ節約です。これは、 FETCH_ROWが単純な数値インデックスアレイを返し、 FETCH_ASSOCは列名のマッピングを列値に保存するためにより多くのメモリを必要とする連想配列を返すためです。
具体的には、 fetch_assocによって返される配列は毎回列名の文字列を含み、 fetch_rowは数値インデックスを返すだけです。これは、 FETCH_ROWがメモリの使用量においてより費用対効果が高いことを意味します。特に、クエリの結果に多数の列が含まれている場合、ギャップはより明白です。
実行速度に関しては、 mysqli_fetch_rowはmysqli_result :: fetch_assocよりもわずかに優れています。これは、 fetch_assocが連想配列を構築するときに列名のマッピングを配列キーに処理するのに余分な時間がかかるためです。 FETCH_ROWは、追加のマッピング処理なしに列の値を直接順番に返します。そのため、速度にはわずかな利点があります。
もちろん、このパフォーマンスの違いは小さなデータセットを扱う場合は明らかではないかもしれませんが、データの量が非常に多い場合、特に大量のデータの頻繁な操作が必要な場合、 FETCH_ROWの利点はさらに明白です。
理解して維持しやすい: fetch_assocによって返される連想配列により、列データにアクセスするのがより直感的になります。列名は、特に複雑なクエリの結果を扱う場合に、開発者が理解して使用するのが非常に簡単な配列のキーです。
列名が必要なシナリオ: FETCH_ASSOCは、クエリ結果に多くの列がある場合、開発者が数値インデックスではなく列名を介してデータにアクセスする必要がある場合に適しています。特に、複数の列を含む大きなデータテーブルを読み取る場合、データは列名を介してすばやく配置できます。
高性能の要件: MySQLI_FETCH_ROWは、メモリフットプリントが少なく、実行効率が高いため、データボリュームが巨大なシナリオに適しています。特に、数百万のデータを処理する必要がある場合、 FETCH_ROWはメモリの使用量を大幅に削減し、クエリ処理速度を上げることができます。
列インデックスが修正された場合: FETCH_ROWは、開発者がクエリ結果の列順序を決定し、列名を使用する必要がない場合、より簡潔で効率的です。
大きなデータクエリに直面すると、パフォーマンスが重要な要素になります。 MySQLI_FETCH_ROWにはメモリフットプリントと実行速度がより多くの利点があるため、特にデータに順次アクセスする必要があるシナリオでは、大量のデータボリュームを照会するのに適しています。
ただし、クエリに多くの列があり、列名に基づいてデータに頻繁にアクセスする必要がある場合、 MySQLI_RESULT :: FETCH_ASSOCはパフォーマンスがわずかに劣っています。
パフォーマンスの比較: mysqli_fetch_rowは通常、特に大規模なデータボリュームを照会する場合、 mysqli_result :: fetch_assocよりも効率的です。
適用可能なシナリオ: mysqli_result :: fetch_assocは、より多くの列名アクセスを備えたシナリオにより適しており、 mysqli_fetch_rowは、効率的なメモリの使用とパフォーマンスの最適化を必要とする大規模なデータクエリにより適しています。
推奨事項:パフォーマンスが最優先事項であり、列名を介してデータにアクセスする必要がない場合は、 mysqli_fetch_rowを使用することをお勧めします。読みやすさと開発の利便性がより重要であり、データの量が比較的少ない場合、 mysqli_result :: fetch_assocがより良い選択です。
関連タグ:
mysqli_result