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