1回のSELECTで行数取得->条件分岐->結果表示までを行う

php+MySQLを用いたウェブ開発を勉強中。
これまでPDOを使ってSELECT結果の行数を取得する方法として以下の記述を採用していました。

1. 一般的な方法

SELECT結果の行数が0でなければ、本番用のSELECT文を発行してデータ取得・表示。

これだと結果行数取得用のSELECT文と、実際にデータを取得するSELECT文を発行するため、膨大な回数になるとDBに負荷がかかるのかなーと思って下記のように1回にまとめてみました。

2. カウンターを設置してSQLリクエストを1回にする

本番用のSELECT文を発行してデータ取得・表示。データが無ければwhileループに入らずエラー処理。

result->fetchで取得したデータをwhileで一行ずつ処理していくスタイルに変わりはありませんが、SELECT結果が0件の場合にはwhileループに入らずにスル―します
これにより、あらかじめセットしておいたrowcounterが0のままであれば、SELECT結果が0件の場合の処理を行います。

今回はシンプルなSQL文ですのでDBに対する負荷は極めて小さく、前述した方法でも問題ないかもしれませんが、中間テーブルを用いた内部結合や膨大なデータからのサーチにおいては、頻繁なSQL文の発行は避けた方が無難かもしれません。

実際には前述のSELECT count(column_name)… + fetchColumn()を用いなくとも、別の方法でも行数は確認することは可能です。

これを書いていて思ったのですが、1回目から本番用のSELECT文を最初から投げたとしても、MySQLのhave_query_cacheがYESであれば、2回目のSELECTの際はキャッシュが効きますので、DB負荷はほとんどかからない気もします。

このあたりはまだテストしていないので、暇なときにテストして調べてみます。

仕事そっちのけで記事を書いた人

プログラムしたりトレードしたりスケートしたりけん玉したりするひと。趣味はトライアンドエラー。優しいときもあれば厳しいときもある。寝不足を基本とする。

Comment

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。