Techniical-support

MySQLの全文検索 Mroongaを使ってみる

みなさんこんにちは。
週末にここ最近自宅PCのブラウザ動作が重い原因が解決してすっきりした構築担当の川合です。
ブラウザキャッシュの出力先ディスクがへたっていたのが原因でした。
SSDの領域に戻したところ動作が軽快になりました。なんとか新型RyZenまでもってほしいものです。

今回は、MySQLの全文検索 Mroongaを使う機会があったので少し触ってみましたというお話です。

概要

今回検証で利用する環境は、CentOS7系最新とMySQL5.7系最新になります。
Mroongaは、MySQL5.7に適合する最新のものを利用します。

テストデータを入れてみて、全文検索の有り無しで結果がどう変わるのかを見たいと思います。

準備

まず、MySQL5.7をインストールするところから始めます。

yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum-config-manager --disable mysql-connectors-community mysql-tools-community mysql80-community
yum install --enablerepo=mysql57-community mysql-community-server

続いて、epelのリポジトリもインストールします。

yum install epel-release
yum-config-manager --disable epel

あとは、Mroongaをインストールするだけになりますが先にMySQLの初期設定を済ませておきます。
※Mroongaのパッケージイをンストールする際に、MySQLのrootパスワードが必要になるため

今回は、インストール時に生成される一時パスワードで初期設定を済ませました。

初期設定が完了したら、Mroongaもインストールしてみます。
まず最初にgroongaのリポジトリを追加するところから始めます。

yum install https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
=====================================================================================================================
 Package                     アーキテクチャー   バージョン          リポジトリー                                容量
=====================================================================================================================
インストール中:
 groonga-release             noarch             1.5.2-1             /groonga-release-latest.noarch              14 k

トランザクションの要約
=====================================================================================================================

リポジトリを追加できれば、mroongaをインストールします。

yum install --enablerepo=epel mysql57-community-mroonga
=====================================================================================================================
 Package                               アーキテクチャー   バージョン                リポジトリー                容量
=====================================================================================================================
インストール中:
 mysql57-community-mroonga             x86_64             10.03-1.el7               groonga-centos             253 k
依存性関連でのインストールをします:
 groonga-libs                          x86_64             10.0.4-1.el7              groonga-centos             1.9 M
 groonga-normalizer-mysql              x86_64             1.1.4-1.el7               groonga-centos              53 k
 libzstd                               x86_64             1.4.5-3.el7               epel                       331 k
 msgpack                               x86_64             3.1.0-4.el7               epel                        27 k

トランザクションの要約
=====================================================================================================================
インストール  1 パッケージ (+4 個の依存関係のパッケージ)
Running transaction
  インストール中          : msgpack-3.1.0-4.el7.x86_64                                                           1/5 
  インストール中          : libzstd-1.4.5-3.el7.x86_64                                                           2/5 
  インストール中          : groonga-libs-10.0.4-1.el7.x86_64                                                     3/5 
  インストール中          : groonga-normalizer-mysql-1.1.4-1.el7.x86_64                                          4/5 
  インストール中          : mysql57-community-mroonga-10.03-1.el7.x86_64                                         5/5 
Enter password: 
Enter password: 

Enter password: でMySQLのrootパスワードを入力します。※確認のため、2回入力
パスワードが入力されると、プラグインをインストールするSQLが内部で実行されます。

もし、パスワードの入力を間違えたりしてしまっても後からインストールする事は可能です。

/usr/share/mroonga/install.sql がインストールする際に流すSQLなので

mysql -u root -p < /usr/share/mroonga/install.sql 

としてあげれば大丈夫です。

無事インストールが完了すれば、以下のコマンドでインストール状況を確認することができます。

mysql -u root -p

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
抜粋
| Mroonga                    | ACTIVE   | STORAGE ENGINE     | ha_mroonga.so        | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+

mysql> SHOW ENGINES\G 
      Engine: Mroonga
     Support: YES
     Comment: CJK-ready fulltext search, column store
Transactions: NO
          XA: NO
  Savepoints: NO

mysql> SHOW VARIABLES LIKE 'mroonga_version';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| mroonga_version | 10.03 |
+-----------------+-------+
1 row in set (0.00 sec)

これでインストールされていることが確認できました。
今回は、MroongaのMySQL5.7用のバージョン10.03がインストールされました。

動作確認

全文検索のプラグインの動作を確認するために、まずサンプルデータを入れてみます。

mysql> CREATE DATABASE testdb;

mysql> USE testdb;

mysql> CREATE TABLE diaries (
    ->   id INT PRIMARY KEY AUTO_INCREMENT,
    ->   content VARCHAR(255),
    ->   FULLTEXT INDEX (content)
    -> ) ENGINE = Mroonga DEFAULT CHARSET utf8;
Query OK, 0 rows affected (0.09 sec)

テーブルを作成するときに、エンジンをMroongaとして定義するところが肝になります。
何も宣言しないとInnoDBになってしまいますので、注意が必要です。

では、データを入れてみます。

mysql> INSERT INTO diaries (content) VALUES ("テスト");
mysql> INSERT INTO diaries (content) VALUES ("テストEX");

全文検索できるようにselect分を発行します。
すると、テスト と テストEX どちらも表示されることが確認できます。

mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("+テスト" IN BOOLEAN MODE);
+----+-------------+
| id | content     |
+----+-------------+
|  1 | テスト      |
|  2 | テストEX    |
+----+-------------+
2 rows in set (0.04 sec)

ちなみに

InnoDBの場合は、以下のようになります。
同じ内容のデータを別のテーブルに追加します。

mysql> INSERT INTO diaries2 (content) VALUES ("テスト");

mysql> INSERT INTO diaries2 (content) VALUES ("テストEX");

mysql> SELECT * FROM diaries2;
+----+-------------+
| id | content     |
+----+-------------+
|  1 | テスト      |
|  2 | テストEX    |
+----+-------------+
2 rows in set (0.00 sec)

ただし、全文検索の結果が変わります。
テストしか結果が表示されず、テストEXは条件に引っかかっていません。

mysql> SELECT * FROM diaries2 WHERE MATCH(content) AGAINST("+テスト" IN BOOLEAN MODE);
+----+-----------+
| id | content   |
+----+-----------+
|  1 | テスト    |
+----+-----------+
1 row in set (0.00 sec)

テーブルのストレージエンジンを変更してみます。
InnoDBからMroongaへ。

mysql> ALTER TABLE diaries2 ENGINE = Mroonga;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM diaries2 WHERE MATCH(content) AGAINST("+テスト" IN BOOLEAN MODE);
+----+-------------+
| id | content     |
+----+-------------+
|  1 | テスト      |
|  2 | テストEX    |
+----+-------------+
2 rows in set (0.04 sec)

ストレージエンジンをMroongaにすると、テーブルが所属しているデータベース名で
mrnというファイル群がMySQLのデータ領域に作成されます。

ls -la /var/lib/mysql
-rw-r-----   1 mysql mysql     4096  7月  6 09:54 testdb.mrn
-rw-r-----   1 mysql mysql 17051648  7月  6 09:54 testdb.mrn.0000000
-rw-r-----   1 mysql mysql  8392704  7月  6 09:54 testdb.mrn.0000100
-rw-r-----   1 mysql mysql  4468736  7月  6 09:54 testdb.mrn.0000101
-rw-r-----   1 mysql mysql 12857344  7月  6 09:54 testdb.mrn.0000102
-rw-r-----   1 mysql mysql  4198400  7月  6 09:54 testdb.mrn.0000103
-rw-r-----   1 mysql mysql  4243456  7月  6 09:49 testdb.mrn.000010A
-rw-r-----   1 mysql mysql  4198400  7月  6 09:49 testdb.mrn.000010B
-rw-r-----   1 mysql mysql  8663040  7月  6 09:49 testdb.mrn.000010C
-rw-r-----   1 mysql mysql  8437760  7月  6 09:49 testdb.mrn.000010D
-rw-r-----   1 mysql mysql  1347584  7月  6 09:49 testdb.mrn.000010E
-rw-r-----   1 mysql mysql     4096  7月  6 09:49 testdb.mrn.000010E.c
-rw-r-----   1 mysql mysql  4243456  7月  6 09:54 testdb.mrn.000010F
-rw-r-----   1 mysql mysql  4198400  7月  6 09:54 testdb.mrn.0000110
-rw-r-----   1 mysql mysql  8663040  7月  6 09:54 testdb.mrn.0000111
-rw-r-----   1 mysql mysql  8437760  7月  6 09:54 testdb.mrn.0000112
-rw-r-----   1 mysql mysql  1347584  7月  6 09:54 testdb.mrn.0000113
-rw-r-----   1 mysql mysql     4096  7月  6 09:54 testdb.mrn.0000113.c
-rw-r-----   1 mysql mysql  1048576  7月  6 09:54 testdb.mrn.001
-rw-r-----   1 mysql mysql 12632064  7月  6 09:49 testdb.mrn.conf
-rw-r-----   1 mysql mysql  4468736  7月  6 09:49 testdb.mrn.options

まとめ

MySQLの全文検索プラグインのMroongaを使ってみたお話でした。
公式サイトの内容を見ながらとりあえず動くところまでは出来たと思います。
今回は、全文検索が動作するか確認したコマンド以外にもorとかandなど検索条件を変える事が出来るようなので利用用途に合わせて使い分けて頂ければと思います。