General

あるアイテムと前後のものを同時に取得 その2

2008年1月19日

4つの方法を用い、スピードを比較した。ここで用いているデータは、およそ250個のアイテムがすでに挿入されている、Nucleus-SQLiteのnucleus_itemテーブルを用いた。

方法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>

コメント

コメントはありません

コメント送信