タグ の絶対数が多いからかな?なんて思ったり、サーバのせいかとも思ったんですが…
function scanExistTags() で、二つのテーブルからそれぞれ
タグ を取得してそれを比較してる部分があったんですが、これを片方にする事で簡単にスピードアップしました
それと、以前から気になってた部分の最適化(というほどのものかどうか解りませんが)で、ほぼ満足のいくスピードに仕上がりました
気になってた部分というのは、
タグ クラウドのリンク生成時に、その
タグ が付けられているアイテムのタイトルを『title』属性でポップアップ表示されるようになってる訳ですが、この部分で『
タグ が打たれているアイテムの数』の回数、SQLが発行されてました
for ($i=0;$i<$tagAmount;$i++) {
$qQuery = 'SELECT ititle as result '
. 'FROM %s WHERE inumber = %d';
$qQuery = sprintf($qQuery, sql_table('item'), intval($inums[$i]));
$itemtitle = quickQuery($qQuery);
$shortTitle = shorten(strip_tags($itemtitle), 10, '...');
$shortTitle = htmlspecialchars($shortTitle, ENT_QUOTES, _CHARSET);
$printData['tagItem'] = array(
'itemid' =
'itemtitle' =
);
$tagitems[] = TEMPLATE::fill($template['tagItem'], $printData['tagItem']);
}
この部分を改造して、1回のSQLで全てのタイトルを取得するように変更、ついでに、どうせ表示しきれないんだから、取得する数も4つまでとしました
$iids = array_slice($inums, 0, 4);
sort($iids);
$qQuery = ' SELECT '
. ' SUBSTRING(ititle, 1, 12) as short_title'
. ' FROM '
. sql_table('item')
. ' WHERE '
. ' inumber in (' . implode(',', $iids) . ') '
. 'ORDER BY '
. ' inumber';
$sTitles = sql_query($qQuery);
$i = 0;
while ($sTitle = mysql_fetch_assoc($sTitles)) {
$shortTitle = mb_convert_encoding($sTitle['short_title'], _CHARSET, _CHARSET);
$printData['tagItem']
= array(
'itemid' =
'itemtitle' =
);
$i++;
$tagitems[] = TEMPLATE::fill($template['tagItem'], $printData['tagItem']);
}
これでベンチ値が、
タグ クラウドを表示しない時と比べて0.4秒前後の増加で済むようになりました
以前は、
タグ が打たれているアイテム数の多いものばかり表示すると、最大で20秒以上、平均で16秒ほど(少ないものばかりだと5秒くらい)かかっていたページ生成時間が、アイテム数にかかわらず平均2.3秒と大幅に短縮、最大値で1000%の速度向上です
しばらくこのまま様子を見て、不具合が出ないようでしたらリリースします
kimitakeさん、ShowBlogs仕様になっちゃいますけど、これで安心して導入できます? 8)
チェックを外してください It notifies with mail when there is a reply in this entry.
情報を記憶しておく
Latest Comments
shizuki:
そうだ、後 ・ブックマークレットからの投稿時のPingイベン...
きゃしゃ:
拾っていただいてありがとうございます。 shizukiカスタム期...
shizuki:
>まみおさん Andyさんの息がかかったやつはとりあえずこ...
shizuki:
>hsurさん 確かに、ずいぶん前からありますねぇ… >いい...
まみお:
> タグとカテゴリも実装しました。でも,そのブランチはお...