みなさんこんにちは。
週末にここ最近自宅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など検索条件を変える事が出来るようなので利用用途に合わせて使い分けて頂ければと思います。
プロフィール
サーバ構築周り全般を対応しております。
LINK
クラウドベリージャム:プロフィールページ