不健全なフルテキストインデックスの使用
リレーしているメールサーバーのログをちょっと集計する必要があったんですが、ログがまず、受け取ったログと、送信したログに分離されているタイプのものだったんです。
で、一応メッセージ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くらいまで下がってちょっとビックリ。
#でもインストールする時間のコストを考えたらメリットあったのかと言われると微妙。