2007-11-18 tDiary+MySQL高速化大作戦
なんか昨日から、tDiary+MySQLと闘っている気がしてなりません。
14時間くらいは闘ったゾ?(疲れた)
◆ [日記][tDiary] tDiaryのDB化
公式で配っているcontribにもdbi_io.rbがあるのだが、重大な欠陥が。
公式のdbi_ioは開発版のtDiary 2.1.4向け。しかもDB化に関して、クリティカルなポイントが修正されている(;´Д`)
とりあえず、tDiary 2.0.4では月単位で日記・リファーデータを引っこ抜いていく(そしてリファーデータを適当に書き換えて、月単位で書き込む)という、頭悪いシステムになってるっぽいです(;´Д`)2.1.4でそれが解決されているかは疑問ですが。というか、ソースコードを見る限り、もっと頭悪くなってる予感が……プラグインでやるのKAYO! IO周りはまとめろよ!
というわけで、まとめてみた。
……劇的に遅い。なぜ? と思ってよく考えたら、1ページ表示するのに1ヶ月分の全リファーを読み込んでるじゃありませんか。アホですか。そりゃ1アクセスでも500だったりタイムアウトしたりするわ!
ウチの日記では編集モード以外ではリンク元を表示しない設定にしているので、そんな無駄な処理はイリマセン(キッパリ
でも、restore_refererで全く読まないコード(いきなりreturn)にすると、編集モードでも読めないんだよねー。というわけで、勝手にdbi_io.rbのtransactionの引数を(date)から(date,getref=false)へ書き換えて、restore_referer(diaries)をrestore_referer(diaries,getref)にして、restore_referer(diaries,getref)の最初で
if getref != true then
return
end
とする。んでもって、~/tdiary.rbの1200行目前後にある、TDiaryEditのinitializeの@io.transaction( @date ) do |diaries|となっている所を
@io.transaction( @date ,true ) do |diaries|に書き換える。我ながらいい加減な変更だ。
んでもって、適当にテーブルつくってrestore_refererとstore_refererでデータ取得・格納が出来るようにする。ついでにdefaultioいらないので、cache周りを全部コメントアウト(笑)
最初、「表示するとなぜか2回」DbiIOのtransactionを呼び出す謎の挙動を示す。色々ダンプして遊んだ結果、どうやらリンク先の日付と、最新の日付の2回分呼び出されてるっぽい。defaultioでもそうだったので、これは仕様だろう(笑)
というわけで、それに習って適当にソースをいじくり回す。
超・アドホックだが、restore_refererでリファーを読み込まないため、store_refererのdiary.each_referer( diary.count_referers )が、変更された分のみの更新となる。まぁ、これで良しとしよう。
最終的には日記・コメント・リファーをDBMSにおねがいする(aとかcounterは勝手に作ってくれるのでパス)状態で、5407回/5分位は返事を返せるようになった。うむ、満足。
所で、tDiary 2.1.4って何がどう変わっているのだろう?
あとで試してみよう。うん。
ちなみに2.1.4でも同じコードで動いたら、まとめて公開します。
◆ [日記][tDiary] tDiary 2.1.4にパッチを当てて、2.0.4と同じ感じにしてみる。
とりあえず、最初に喰らったのは予想通り500 Internal Server Error。
どっか間違ってると思いましたさ(笑)
どこかなーと探してみると、index.rbに仕掛けた
rescue DBI::DatabaseError => e
でuninitialized constant DBI (NameError)と言われていた。
なんじゃらほい?と思ったが、そう言えば今defaultio使って構築してるから、DBIなんて読み込んでないのねん(笑)というわけで
require 'dbi'
こんな感じの行を追加。
あと、if-elsif-else-endの対応を1個end書き忘れていて怒られた。
と、ここまではスムーズだったのだが…
一番問題解決に時間がかかったところは、各セクションの頭にある、◆でリンクが張られないこと。
ソースコードを追い回した結果、misc/plugin/blog-style.rbでsubtitle_linkが上書きされていた(苦笑
blog-style.rbのタイトルを変える機能は使いたいので、subtitle_linkをコメントアウトした。
よし、大体予定通りの動きをした!(笑)
細かいチェックとかは明日にしよう。
はふー、疲れたよー……
ざっくりと、tDiary-2.1.4とパッチバージョンのdiffを取る。939行。約33Kバイト。
疲れた……