PHPによるDBの扱い方を工夫してみる

ネットで色々見てると、インターネットは玉石混交と言わんばかりに、様々なコードが転がっていますね。
それで1つ気付いたコードを考察してみます。

まずはこれ。

$pager =& Pager::factory($pager_param);
$navi = $pager -> getLinks();
print($navi["all"]);

$currentPageID = $pager -> getCurrentPageID();
$index = ($currentPageID - 1) * $pagelimit + 1;

for($i = 1; $i < $index + $pagelimit; $i++)
{
$row = $result->fetchRow(DB_FETCHMODE_ASSOC);
if($i >= $index)
{
print  $row['size']."," . $row['name'] . "</br>";
}
}

このコードの範囲内だけ(こういうコードに至ったことの良し悪しは置いといて)で見たときに、少し改良できる点があります。


このコードは、for内のループの扱いで、このループはDBからデータを呼び出したとき、Pear::Pagerによって改ページを生成するためのものです。

しかし、これだと、改ページの番号が少ない間は高速ですが、番号が多くなるにつれて無駄にループが多くなり、呼び出しに時間がかかってしまいます。

$i=1から順番にまわし続けて、表示したい番号($index)ときのみ表示するため、$indexの数が増えれば増えるほどループが多くなり遅くなります。

これは、DBの行の数が少なければ問題ないですが、すごく多い場合はやっかいです。

そこで、どんな場合でもいける実装にforループを変えてみると、こうなります。

for($i = $index; $i < $index + $pagelimit; $i++)
{
$row = $result->fetchRow(DB_FETCHMODE_ASSOC,$i-1);
print  $row['size']."," . $row['name'] . "</br>";
}

これだと、どんな改ページのときでも、その時にあった番号からデータを読み込んで表示するので、無駄なループが必要なくなります。

体感でも、数万行を超えるDBを扱う場合は、かなり早くなっていました。

プログラムのコーディングをうまくなるためには、

インターネットでソースを見つけ、真似たをして、さらに自分なりに改良すること

が大事だと思います。