あるアイテムと前後のものを同時に取得 その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>