Joruri でタグ検索が遅いと感じたら

この記事は公開されてから7年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。

Joruri とは徳島県で作られた Ruby on Rails を利用したCMSです。地方自治体向けのCMSとして人気があります。
で、使っているとタグ検索のときにかなりレスポンスが遅いなと感じることがありましたので、ちょっと調べてみました。

article_tags テーブルの word カラムにインデックスを張ると速くなりそう。

word カラムは text 型なのでインデックスを張るときに文字列長を指定しないといけません。文字列長を指定せずに行うと次のようにエラーになります。

基本的にタグに使う単語は短いとおもうので、

とかでも大丈夫ですが、いまのすべてタグで一番長い単語をさがすには次のSQLで調べることができます。

これだと、6文字の「ウォーキング」というタグが一番長いということがわかります。
なので、次のような create index 文になります。

それか今後増えるであろう長めのタグのことを考えて

とかでもいいと思います。

インデックスを張る前と後でSQLの実行時間を比べてみました。
インデックスを張る前

3回行った結果です。
7 rows in set (7.60 sec)
7 rows in set (7.65 sec)
7 rows in set (7.57 sec)

インデックスを張る

インデックスを張った後

3回行った結果です。
7 rows in set (0.32 sec)
7 rows in set (0.24 sec)
7 rows in set (0.23 sec)

実に 20分の1 まで速くなりました。

条件:
article_docs の件数: 2800強
article_tags の件数: 1500弱

とここまで長く書いておきながらいまさらですが、
article_docs と article_tags を join している unid カラムにもインデックスが張ってなかったので、試しにインデックスを張ったら更に早くなりました。
むしろ、こっちをやれば word カラムのインデックスは不要かも。

7 rows in set (0.01 sec)
7 rows in set (0.02 sec)
7 rows in set (0.01 sec)

インデックスなしの時の 700分の1 になりました、激速です。