tamulab.jp

tamulabはプログラミングのtipsやインターネット上で気になったことなどを書いてます

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

calendar

reload

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 になりました、激速です。

この記事をシェアする

関連記事

入門Redmine 第5版を読んだよ
RubyWorldConference2016の参加券が届いたよ
[ラズパイ] RaspberryPi3でRubyを動かしてSlackに通知する
Redmine 3.2.1でチケットのコピーができなくなった(追記あり:2016-06-30)

about

Toru TAMURA

Toru TAMURA

PHP, Ruby などをあやつるWebエンジニアです。Amazon Web Service(AWS)のユーザーグループ JAWS-UG 島根支部所属 [詳細]