CentOS7 + mysql-community-server でFULLTEXTなテーブルにLOAD DATA  INFILE（InnoDBとMroongaで比較）


# InnoDB

### 全文検索を利用する準備

mecabrcファイルを編集

```bash
$ sudo vim /usr/lib64/mysql/mecab/etc/mecabrc
```

以下を追記

```
dicdir = /usr/lib64/mysql/mecab/dic/ipadic_utf-8
```

my.cnfを編集

```bash
$ sudo vim /etc/my.cnf
```

[mysqld]セクションに以下を追記

```
loose-mecab-rc-file=/usr/lib64/mysql/mecab/etc/mecabrc
innodb_ft_min_token_size=2
```

MySQLの再起動

```bash
$ sudo systemctl restart mysqld
```

MeCabプラグインをインストール

```
MySQL> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
```

### テスト用のデータベース、テーブル作成

テスト用のデータベースを作成

```
MySQL> CREATE DATABASE fulltext_test
DEFAULT CHARACTER SET utf8mb4;
USE fulltext_test;
```

テスト用のテーブルを作成。パーサーはmecab

```
MySQL> CREATE TABLE mecab_test (
	inode BIGINT UNSIGNED  NOT NULL PRIMARY KEY,
	basename CHAR(255),
	path TEXT(1023),
	updated_on DATE,
	INDEX (updated_on),
	FULLTEXT (basename) WITH PARSER mecab
)  ENGINE=InnoDB CHARACTER SET utf8mb4;
```

テスト用のテーブルを作成。パーサーはngram

```
MySQL> CREATE TABLE ngram_test (
	inode BIGINT UNSIGNED  NOT NULL PRIMARY KEY,
	basename CHAR(255),
	path TEXT(1023),
	updated_on DATE,
	INDEX (updated_on),
	FULLTEXT (basename) WITH PARSER ngram
)  ENGINE=InnoDB CHARACTER SET utf8mb4;
```

### タブ区切りテキストを読み込む

テストデータをタブ区切りテキストからmecab_testにロード。200万件で1分45秒。
単純なLOAD DATA  INFILEと比較するとFULLTEXTのインデックスを作成する分、遅いようだ。

```
MySQL> LOAD DATA LOCAL INFILE  "sample.txt"
REPLACE
INTO TABLE mecab_test
FIELDS TERMINATED BY "\0"
LINES TERMINATED BY "\n";

Query OK, 2009640 rows affected (1 min 45.00 sec)
Records: 2009640  Deleted: 0  Skipped: 0  Warnings: 0
```

テストデータをタブ区切りテキストからngram_testにロード。200万件で3分6秒。
mecabよりさらに遅い。

```
MySQL> LOAD DATA LOCAL INFILE  "sample.txt"
REPLACE
INTO TABLE ngram_test
FIELDS TERMINATED BY "\t"
LINES TERMINATED BY "\n";

Query OK, 2009640 rows affected (3 min 6.14 sec)
Records: 2009640  Deleted: 0  Skipped: 0  Warnings: 0
```

### チューニング

バイナリログはデフォルトでOFFのよう。

````
MySQL> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
```

ログバッファサイズを大きめに

```bash
$ sudo vim /etc/my.cnf

# 以下を追記

innodb_log_file_size = 4G
innodb_log_buffer_size = 1G
```

あんまし早くならない。
インデックス生成に時間を食ってる訳だから、ログバッファは関係無いということか。

||1M件|2M件|4M件|8M件|16M件|
|:--|:--|:--|:--|:--|:--|
|**無指定**|13秒|67秒|135秒|271秒|548秒|
|**innodb_log_buffer_size=1G**|19秒|27秒|63秒|218秒|510秒|
|**innodb_log_buffer_size=2G**|14秒|31秒|59秒|20９秒|531秒|



# Mroonga

### 全文検索を利用する準備

Mroongaのインストール

```bash
$ sudo yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
$ sudo yum install -y yum-utils
$ sudo yum install -y --enablerepo=epel mysql57-community-mroonga
$ sudo yum install -y --enablerepo=epel groonga-tokenizer-mecab
$ sudo systemctl restart mysqld
$ mysql -u root -p < /usr/share/mroonga/install.sql
```

my.cnf書き換え

```vim
# [mysqld]セクションに以下を追記

mroonga_default_tokenizer=TokenMecab
```

MySQLを再起動

```bash
$ sudo service mysqld restart
```

### テスト用のテーブル作成

```
MySQL> CREATE TABLE mroonga_test (
    inode BIGINT UNSIGNED  NOT NULL PRIMARY KEY,
    basename CHAR(255),
    path TEXT(1024),
    updated_on DATE,
    INDEX (updated_on),
    FULLTEXT (basename)
)  ENGINE=Mroonga CHARACTER SET utf8mb4;
```

### タブ区切りテキストを読み込む

```
LOAD DATA LOCAL INFILE  "sample.txt"
REPLACE
INTO TABLE mroonga_test
FIELDS TERMINATED BY "\0"
LINES TERMINATED BY "\n";
```

### 結果

mroongaは所要時間がリニアに伸びて、大量データのロードにもメゲない印象。

||1M件|2M件|4M件|8M件|16M件|32M件|64M件|
|:--|:--|:--|:--|:--|:--|:--|:--|
|**mroonga**|25秒|50秒|97秒|202秒|399秒|813秒|1,635秒|
|**innodb_log_buffer_size=1G**|19秒|27秒|63秒|218秒|510秒|