Rabbit Slide Show

MySQL 8.0でMroonga

2018-07-23

Description

MySQL 8.0でMroongaを使うとこんなにうれしい!

Text

Page: 1

MySQL 8.0で
Mroonga
須藤功平
クリアコード
MyNA会 2018年7月
2018-07-23
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 2

Mroonga
MySQLの
ストレージ
エンジン
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 3

ストレージエンジン
C++で実装
MySQLのハンドラーAPIを使う
ハンドラーAPIっていう名前なの?
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 4

ハンドラーAPI
すごくよく変わる
メジャーバージョンアップ
絶対変わる
MyNAバージョンアップ
たまに変わる
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 5

MySQL 8.0対応
1. ビルドエラー修正
API変更に対応
2. 新機能対応
新COLLATION対応とか
3. テストをパスするようにする
ビルドができても期待通りに動くとは限らない
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 6

制約
対応MySQL族で
Mroongaのテストを
すべてパスし続ける
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 7

対応MySQL族
MySQL
5.5, 5.6, 5.7
MariaDB
5.5, 10.0, 10.1, 10.2, 10.3
Percona Server for MySQL
5.6, 5.7
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 8

Travis CI
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 9

AppVeyor
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 10

MySQL 8.0対応の現状
1. ビルドエラー修正
完了
2. 新機能対応
完了
3. テストをパスするようにする
未完 (全然おわんねーの)
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 11

ビルドエラー修正までの道
90コミット
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 12

API変更パターン
1. ふつうのC++になった
すごくよいこと
2. 名前が変わった
3. 新しいなにかが増えた
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 13

ふつうのC++
my_bool→bool
必要なヘッダーだけ#include
HASH→std::unordered_map
std::stringを使える!
autoを使える!
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 14

名前が変わった
型:st_select_lex→SELECT_LEX
API:
order->direction == ORDER_ASC
order->direction == ORDER::ORDER_ASC
order->asc
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 15

対応方針
上位互換APIを用意して使う
使わない引数は単に無視
コード中で#ifしない
メンテナンスできないコードのできあがり!
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 16

互換型
#if MYSQL_VERSION_ID >= 80011 && !defined(MRN_MARIADB_P)
class SELECT_LEX;
typedef SELECT_LEX mrn_select_lex;
#else
typedef st_select_lex mrn_select_lex;
#endif
// mrn_select_lex *select_lex = table_list->select_lex;
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 17

互換API
#if MYSQL_VERSION_ID >= 80011
# define MRN_ORDER_IS_ASC(order) \
((order)->direction == ORDER_ASC)
#elif MYSQL_VERSION_ID >= 50603
# define MRN_ORDER_IS_ASC(order) \
((order)->direction == ORDER::ORDER_ASC)
#else
# define MRN_ORDER_IS_ASC(order) ((order)->asc)
#endif
// if (MRN_ORDER_IS_ASC(order)) {...}
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 18

新しいなにかが増えた
dd::*が増えた
data dictionaryだって
テーブル定義の取得方法が変わった
handlerにメンバー関数追加
実装して対応しないといけない
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 19

対応方針
説明が面倒に
なってきたので
省略
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 20

新機能対応
新COLLATION対応
utf8mb4_0900_ai_ci
utf8mb4_0900_as_ci
utf8mb4_0900_as_cs
utf8mb4_ja_0900_as_cs
utf8mb4_ja_0900_as_cs_ks
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 21

groonga-normalizer-mysql
1.1.4で全部対応!
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 22

テストデータ
CREATE TABLE x (
a text,
FULLTEXT INDEX (a)
) ENGINE=Mroonga;
INSERT INTO x VALUES
INSERT INTO x VALUES
INSERT INTO x VALUES
INSERT INTO x VALUES
INSERT INTO x VALUES
INSERT INTO x VALUES
MySQL 8.0でMroonga
("はひふへほ");
("ばびぶべぼ");
("ハヒフヘホ");
("バビブベボ");
("ハヒフヘホ");
("バビブベボ");
Powered by Rabbit 2.2.2

Page: 23

確認方法
SELECT * FROM x
WHERE MATCH(a)
AGAINST('+バビブベボ' IN BOOLEAN MODE);
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 24

utf8mb4_0900_ai_ci
ALTER TABLE x MODIFY COLUMN a text
COLLATE utf8mb4_0900_ai_ci;
-- +--------------------------------+
-- | a
|
-- +--------------------------------+
-- | はひふへほ
|
-- | ばびぶべぼ
|
-- | ハヒフヘホ
|
-- | バビブベボ
|
-- | ハヒフヘホ
|
-- | バビブベボ
|
-- +--------------------------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 25

utf8mb4_0900_as_cs
ALTER TABLE x MODIFY COLUMN a text
COLLATE utf8mb4_0900_as_cs;
-- +-----------------+
-- | a
|
-- +-----------------+
-- | バビブベボ
|
-- +-----------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 26

utf8mb4_ja_0900_as_cs
ALTER TABLE x MODIFY COLUMN a text
COLLATE utf8mb4_ja_0900_as_cs;
-- +-----------------+
-- | a
|
-- +-----------------+
-- | ばびぶべぼ
|
-- | バビブベボ
|
-- +-----------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 27

utf8mb4_ja_0900_as_cs_ks
ALTER TABLE x MODIFY COLUMN a text
COLLATE utf8mb4_ja_0900_as_cs_ks;
-- +-----------------+
-- | a
|
-- +-----------------+
-- | バビブベボ
|
-- +-----------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 28

Mroongaの正規化
MySQLとはステージが違う
濁点とかひらがなとかカタカナとか小文
字とか絵文字とかそういうステージじゃ
ないから
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 29

使用Unicodeのバージョン
MySQL: 9.0.0
Mroonga: 10.0.0
2018-07時点の最新Unicodeバージョン:11.0.0
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 30

使い方
CREATE TABLE x (
a text,
FULLTEXT INDEX (a)
-- MariaDBだとNORMALIZER='NormalizerNFKC100'と書ける!
COMMENT='normalizer "NormalizerNFKC100"'
) ENGINE=Mroonga;
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 31

デフォルト
AGAINST('+バビブベボ' IN BOOLEAN MODE)
-- +-----------------+
-- | a
|
-- +-----------------+
-- | バビブベボ
|
-- | バビブベボ
|
-- +-----------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 32

unify_kana
-- COMMENT='normalizer
-- "NormalizerNFKC100(\'unify_kana\', true)"'
AGAINST('+バビブベボ' IN BOOLEAN MODE)
-- +-----------------+
-- | a
|
-- +-----------------+
-- | ばびぶべぼ
|
-- | バビブベボ
|
-- | バビブベボ
|
-- +-----------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 33

unify_voiced_sound_mark
-- COMMENT='normalizer
-- "NormalizerNFKC100(\'unify_voiced_sound_mark\', true)"'
AGAINST('+バビブベボ' IN BOOLEAN MODE)
-- +--------------------------------+
-- | a
|
-- +--------------------------------+
-- | ハヒフヘホ
|
-- | バビブベボ
|
-- | ハヒフヘホ
|
-- | バビブベボ
|
-- +--------------------------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 34

unify_kana_case
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
MySQL 8.0でMroonga
INTO
INTO
INTO
INTO
INTO
INTO
x
x
x
x
x
x
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
("やゆよ");
("ゃゅょ");
("ヤユヨ");
("ャュョ");
("ヤユヨ");
("ャュョ");
Powered by Rabbit 2.2.2

Page: 35

unify_kana_case
-- COMMENT='normalizer
-- "NormalizerNFKC100(\'unify_kana_case\', true)"'
AGAINST('+ヤユヨ' IN BOOLEAN MODE)
-- +-----------+
-- | a
|
-- +-----------+
-- | ヤユヨ
|
-- | ャュョ
|
-- | ヤユヨ
|
-- | ャュョ
|
-- +-----------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 36

unify_hyphen
ハイフンっぽい文字を
-˗֊‐‑‒–⁃⁻₋−
ハイフンへ
-(U+002D)
ユースケース:電話番号検索
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 37

unify_prolonged_sound_mark
長音記号っぽい文字を
ー—―─━ー
長音記号へ
ー(U+30FC)
ユースケース:電話番号検索
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 38

unify_hyphen_and_
prolonged_sound_mark
ハイフンっぽい文字と
-˗֊‐‑‒–⁃⁻₋−
長音記号っぽい文字を
ー—―─━ー
ハイフンへ
-(U+002D)
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 39

unify_middle_dot
中点っぽい文字を
·ᐧ•∙⋅⸱・・
中点へ
·(U+00B7)
ユースケース:外来語検索
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 40

unify_katakana_v_sounds
ヴァヴィヴヴェヴォを
バビブベボへ
ユースケース:外来語検索(ワイン名)
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 41

unify_katakana_bu_sound
ヴァヴィヴヴェヴォを
ブへ
ユースケース:外来語検索(ワイン名)
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 42

オプションは組み合わせ可能
-- ワイン名検索用
-- COMMENT='normalizer
-- "NormalizerNFKC100(
--
\'unify_middle_dot\', true,
--
\'unify_katakana_bu_sound\', true)"'
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 43

トークナイザー
MySQLとはステージが違う
ゆるく検索するモード
電話番号・ワイン名検索に便利
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 44

ゆるく検索
loose_symbol
記号の有無に関係なくマッチ
loose_blank
空白文字の有無に関係なくマッチ
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 45

書き方
-- MariaDBだと↓と書ける!
-- TOKENIZER='TokenNgram("loose_symbol", true)'
-- COMMENT='tokenizer
-- "TokenNgram(\'loose_symbol\', true)"'
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 46

電話番号検索例
INSERT
INSERT
INSERT
INSERT
INSERT
MySQL 8.0でMroonga
INTO
INTO
INTO
INTO
INTO
x
x
x
x
x
VALUES
VALUES
VALUES
VALUES
VALUES
('(123)4567-8901');
('123-4567-8901');
('12345678901');
('(123)4567−8901');
('123 4567 8901');
Powered by Rabbit 2.2.2

Page: 47

電話番号検索例
-- NormalizerNFKC100('unify_hyphen_and_prolonged_sound_mark', true)
-- TokenNgram('loose_symbol', true,
--
'loose_blank', true)
AGAINST('+1234567ー8901' IN BOOLEAN MODE)
-- +--------------------------------------------+
-- | a
|
-- +--------------------------------------------+
-- | (123)4567-8901
|
-- | 123-4567-8901
|
-- | 12345678901
|
-- | (123)4567−8901
|
-- | 123 4567 8901
|
-- +--------------------------------------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 48

ワイン名検索例
INSERT
INSERT
INSERT
INSERT
MySQL 8.0でMroonga
INTO
INTO
INTO
INTO
x
x
x
x
VALUES
VALUES
VALUES
VALUES
('セーヴェル エ メーヌ');
('セブルエメーヌ');
('セーブル・エ・メーヌ');
('セーヴル エメーヌ');
Powered by Rabbit 2.2.2

Page: 49

ワイン名検索例
-- NormalizerNFKC100('unify_middle_dot', true,
--
'unify_hyphen_and_prolonged_sound_mark', true,
--
'unify_katakana_bu_sound', true)
-- TokenNgram('loose_symbol', true,
--
'loose_blank', true)
AGAINST('+セーヴェルエメーヌ' IN BOOLEAN MODE)
-- +--------------------------------+
-- | a
|
-- +--------------------------------+
-- | セーヴェル エ メーヌ
|
-- | セブルエメーヌ
|
-- | セーブル・エ・メーヌ
|
-- | セーヴル エメーヌ
|
-- +--------------------------------+
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 50

テストがパスしない原因
そもそも動かない
動くけどクラッシュする
動くけど期待通りじゃない
動くし期待通りだけど期待通りじゃない
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 51

そもそも動かない例
mysql-test/include/*が減った
have_innodb.inc:InnoDB必須だから
not_embedded.inc:libmysqldを辞めたから
互換.incを用意
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 52

動くけどクラッシュする例
JSON型のカラムの更新
ラッパーモード
使っている人いる?
削除していい?
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 53

動くけど期待通りじゃない例
FOREIGN KEYの制約チェック
dd::*からうまく主キー情報を
取得できていない
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 54

動くし期待通りだけど
期待通りじゃない例
デフォルト値変更→期待結果も変わる
例:COLLATIONの変更
SHOW CREATE TABLEの結果が変わる
テスト方法・結果の変更で対応
例:非デフォルトCOLLATIONを使う
ただただ面倒
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 55

テストがまだパスしていない要因
テスト実行が遅くなった
JSONのやつがなんで動かなくなったか
わからん
dd::*の使い方がわからん
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 56

テスト実行が遅い
mysql-test-runが遅くなった
テスト実行開始まで30秒くらい
メモリー3GB食うようになった
Mroongaのテストは約770個
gdbの起動が遅くなった
mysqldのシンボル読込に15秒くらい
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 57

テストがパスするための支援方法
クリアコードに開発案件を発注
仕事の時間で開発できる!
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Page: 58

次回リリース
8月か9月の肉の日かなぁ
db tech showcase Tokyo 2018の前に
リリースできるといいなぁ
MySQL 8.0でMroonga
Powered by Rabbit 2.2.2

Other slides

Apache Arrow Apache Arrow
2017-06-13
Apache Arrow Apache Arrow
2017-05-28
Mroonga! Mroonga!
2015-10-30