あるアイテムと前後のものを同時に取得 その2
2008年1月19日
4つの方法を用い、スピードを比較した。ここで用いているデータは、およそ250個のアイテムがすでに挿入されている、Nucleus-SQLiteのnucleus_itemテーブルを用いた。
方法1:すべてのアイテムのid,title,timeを一旦メモリに取り込んでおいて、その後に処理。
方法2:方法1と同じだが、sqlite_array_query を使用。
方法3:先の記事で一番最後に述べた方法。
方法4:クエリーを3回実行。一回目であるアイテム、2回目で前を、3回目で後を取得。
結果(それぞれの方法にかかった秒数で表示)
結局は、もっとも単純だと思われる4の方法が一番早かった。SQLのクエリーを複雑に記述する『技』におぼれる弊害が現れているということか。
テストに用いたコード:
方法1:すべてのアイテムのid,title,timeを一旦メモリに取り込んでおいて、その後に処理。
方法2:方法1と同じだが、sqlite_array_query を使用。
方法3:先の記事で一番最後に述べた方法。
方法4:クエリーを3回実行。一回目であるアイテム、2回目で前を、3回目で後を取得。
結果(それぞれの方法にかかった秒数で表示)
Method1: 0.018667936325073 Method2: 0.015633106231689 Method3: 0.0060269832611084 Method4: 0.00052618980407715
結局は、もっとも単純だと思われる4の方法が一番早かった。SQLのクエリーを複雑に記述する『技』におぼれる弊害が現れているということか。
テストに用いたコード:
<html><body><?php $db=sqlite_open('uroko/nucleus/sqlite/.dbsqlite'); $time=microtime()+time(); $res=sqlite_query($db,'SELECT inumber,itime FROM nucleus_item'); while($row=sqlite_fetch_array($res,SQLITE_ASSOC)){ $result[$row['itime']]=$row['inumber']; } ksort($result); $time=microtime()+time()-$time; echo "Method1: $time<br>\n"; $time=microtime()+time(); $res=sqlite_array_query($db,'SELECT inumber,itime FROM nucleus_item',SQLITE_ASSOC); foreach($res as $row){ $result[$row['itime']]=$row['inumber']; } ksort($result); $time=microtime()+time()-$time; echo "Method2: $time<br>\n"; $time=microtime()+time(); $res=sqlite_query($db, 'SELECT i.inumber as thisid, j.inumber as previd, i.ititle as thistitle, j.ititle as prevtitle FROM nucleus_item as i,nucleus_item as j WHERE i.inumber=11 AND j.itime<=i.itime GROUP BY j.itime ORDER BY j.itime DESC LIMIT 1,1'); $row=sqlite_fetch_array($res,SQLITE_ASSOC); $thisitem['itemid']=$row['thisid']; $thisitem['title']=$row['thistitle']; $previtem['itemid']=$row['previd']; $previtem['title']=$row['prevtitle']; $res=sqlite_query($db, 'SELECT j.inumber as itemid, j.ititle as title FROM nucleus_item as i,nucleus_item as j WHERE i.inumber=11 AND j.itime>=i.itime GROUP BY j.itime ORDER BY j.itime ASC LIMIT 1,1'); $nextitem=sqlite_fetch_array($res,SQLITE_ASSOC); $time=microtime()+time()-$time; echo "Method3: $time<br>\n"; //print_r(array($previtem,$thisitem,$nextitem)); $time=microtime()+time(); $rows=sqlite_array_query($db, 'SELECT inumber as itemid, ititle as title, itime as time FROM nucleus_item WHERE inumber=11',SQLITE_ASSOC); $thisitem=$rows[0]; $rows=sqlite_array_query($db, "SELECT inumber as itemid, ititle as title FROM nucleus_item WHERE itime<='$thisitem[time]' AND NOT inumber=11 ORDER BY itime DESC LIMIT 1",SQLITE_ASSOC); $previtem=$rows[0]; $rows=sqlite_array_query($db, "SELECT inumber as itemid, ititle as title FROM nucleus_item WHERE itime>='$thisitem[time]' AND NOT inumber=11 ORDER BY itime ASC LIMIT 1",SQLITE_ASSOC); $nextitem=$rows[0]; $time=microtime()+time()-$time; echo "Method4: $time<br>\n"; print_r(array($previtem,$thisitem,$nextitem)); foreach($result as $time=>$itemid) echo "$time=>$itemid<br>\n"; ?></body></html>