ページング書く際のMySQLの処理

今日ズーット悩んだんだけど、ページングする際のMySQLの処理ってどうやったら一番効率がいいんだろうね。

まず必要なのは、
総データ件数
ページに表示するデータ
の2つを取得すること。

で書き方2つある

案1
すべてのデータをSQL文1つで取得して、そのあとPHPで処理する。
そうする事で取得データ2件を1度にクリア

利点
SQL文1個で済むので、処理が簡単。
そんな更新しないデータならクエリキャッシュで早い

欠点
データの数が多いと全データ取得でMySQLに負荷がかかる。
でもって、処理するPHPにも負荷がかかる

案2
総データ数をcountSQL文で取得して、そのあとページに表示するデータはoffset文を使いページ毎に取得。

利点
SQLの帰り値が少ない。
全体的に必要最低限のデータでやり取りする

欠点
クエリ発行数が2個になる。
受け取るデータが限られるので、変にキャッシュするとページング内容がおかしくなる。
キャッシュできないからページ毎にクエリ投げるしかなくなる。

う~ん。
結果、データ数少ない場合は案1で、データ数多い場合は案2かな。

って思うんだけど、データ数多い、少ないってサーバースペックに依存する話だから、ややこしい


MySQLって取得結果数を限定すれば、早くなるんだね

最近仲良くしているプログラマに聞いたのですが、MySQLってコマンド書くときに、取得件数を限定すれば、早く取得するらしい。

イコール検索の場合、通常は全データに検索を書けるけど、LIMITを指定すると、検索結果が1件でも見つかればそこで処理が終わるんですって。

マジか=~こんな初歩的チックな事知らなかった=。

まあ、私が書いたプログラムは全部自社サイトでしか使ってないから問題ないか~と納得してみる。

けど、PHPやデータベースの負荷を考えてプログラミングしていると、面白い発見がいっぱいありますね。

どうやってクエリ投げて、受け取ったデータをどうやってPHPで処理するかとか。
これにキャッシュを絡めると、ほんと、プログラムの書き方を考えないといけないな~と思う今日この頃。


ページトップへ