不健全なフルテキストインデックスの使用

リレーしているメールサーバーのログをちょっと集計する必要があったんですが、ログがまず、受け取ったログと、送信したログに分離されているタイプのものだったんです。

で、一応メッセージIDで紐付いているので、それぞれをDBに格納してjoinしたら楽かなーと思ってPostgreSQL(8.1.??)に入れました。

で、集計したいのがFromの「ドメイン」とそのFromから送られたメールが送信に失敗した数を数えるというものでして。

受け取り側のテーブルは

Name type 備考
Date varchar
Time varchar
MsgID varchar PK
From varchar メールアドレスが入っている
To varchar メールアドレスが入っている

送信側のテーブルは

Name type 備考
Date varchar
Time varchar
MsgID varchar PK
To varchar メールアドレスが入っている
Status varchar SentかFail

というもの。普通にMsgIDでJoinしてしまえばいいんだけどFromのメールアドレスからドメインを抽出する時には「LIKE '%@ドメイン名'」と実行しないといけないわけなんですよ。

LIKEで後方一致の時ってインデックス張ってても使ってくれないとかそんなことがあったような気がするんですね。
(-> http://www.postgresql.jp/document/pg825doc/html/indexes-types.html)

そこで無駄にフルテキストインデックスを使って全文検索してやればどうにかなるかと思ってですね。

そのためだけにLudiaをインストールするという暇なのかなんなのかわからないことをやりました。

実際に時間測ったらLudia使用前は300msくらいだったものがLudiaを使ったら50msくらいまで下がってちょっとビックリ。

#でもインストールする時間のコストを考えたらメリットあったのかと言われると微妙。