NP_MultipleCategoriesの高速化
2006年12月15日
このブログではNP_MultipleCategories0.38jに若干改造を加えたものを用いているが、カテゴリリストの表示に時間がかかるのが難点であった。アクセスの時刻にもよるが、ページ全体の表示に3.5秒ほどかかり、その時間のほとんどがMultipleCategories::showCategoryList()関数の実行に費やされている。スピード化を試みた。
ソースを見てみると、SQLクエリ中で『RegEx』が多用されている。これがスピードが遅くなる原因であろう。しかも、SQLクエリが入れ子構造になっているので、その解消を行った。まず、
とし、すべてのデータを配列にキャッシュする。続けて、
及び、
のようにして、キャッシュに取り込んだ内容を呼び出すことでクエリ中の『RegEx』を回避した。
これで、すっきり!3.5秒かかっていた表示が0.5秒で済むようになった。うーん、延び延びになっているキャッシングプラグインの開発が、これでまた延びるなぁ。
NP_MultipleCategories::showCategoryList() 全部を表示するには、ここをクリック
ソースを見てみると、SQLクエリ中で『RegEx』が多用されている。これがスピードが遅くなる原因であろう。しかも、SQLクエリが入れ子構造になっているので、その解消を行った。まず、
echo TEMPLATE::fill($this->getOption('catheader'),
array(
'blogid' => $blogid,
'blogurl' => $blogurl,
'self' => $CONF['Self']
));
/* begin modification by kat */
$items=array();
$catdata=array();
$scatdata=array();
$query = 'SELECT inumber,icat FROM '.sql_table('item').
' WHERE iblog='.(int)$blogid.
' AND itime<='.mysqldate($b->getCorrectTime()).
' AND idraft=0';
$res = sql_query($query);
while ($row=mysql_fetch_row($res)) {
$items[$row[0]]=true;
$catdata[$row[1]][$row[0]]=true;
}
$query = 'SELECT item_id, categories, subcategories FROM '.sql_table('plug_multiple_categories');
$res = sql_query($query);
while ($row=mysql_fetch_row($res)) {
if (!$items[$row[0]]) continue;
foreach(explode(',',$row[1]) as $cat) if ($cat) $catdata[$cat][$row[0]]=true;
foreach(explode(',',$row[2]) as $scat) if ($scat) $scatdata[$scat][$row[0]]=true;
}
/* end modification by kat */とし、すべてのデータを配列にキャッシュする。続けて、
/* begin modification by kat */
/*
$cq = 'SELECT count(*) as result FROM '.sql_table('item').' as i';
$cq .= ' LEFT JOIN '.sql_table('plug_multiple_categories').' as p ON i.inumber=p.item_id';
$cq .= ' WHERE ((i.inumber=p.item_id and (p.categories REGEXP "(^|,)'.$data['catid'].'(,|$)" or i.icat='.$data['catid'].')) or (p.item_id IS NULL and i.icat='.$data['catid'].'))';
$cq .= ' and i.itime<=' . mysqldate($b->getCorrectTime()) . ' and i.idraft=0';
$data['catamount'] = quickQuery($cq);
*/
$data['catamount']=count($catdata[$data['catid']]);
/* end modification by kat */及び、
/* begin modification by kat */
/*
$ares = sql_query(
'SELECT count(i.inumber) FROM '
. sql_table('item').' as i, '
. sql_table('plug_multiple_categories').' as p'
. ' WHERE i.idraft=0 and i.itime<='.mysqldate($b->getCorrectTime())
. ' and i.inumber=p.item_id'
. ' and p.subcategories REGEXP "(^|,)'.$sdata['subcatid'].'(,|$)"'
);
if ($ares && $row = mysql_fetch_row($ares)) {
*/
if ($row[0]=count($scatdata[$sdata['subcatid']])) {
/* end modification by kat */のようにして、キャッシュに取り込んだ内容を呼び出すことでクエリ中の『RegEx』を回避した。
これで、すっきり!3.5秒かかっていた表示が0.5秒で済むようになった。うーん、延び延びになっているキャッシングプラグインの開発が、これでまた延びるなぁ。
NP_MultipleCategories::showCategoryList() 全部を表示するには、ここをクリック