SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
MySQL 8.0で
Mroonga
須藤功平 クリアコード
MyNA会 2018年7月
2018-07-23
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
Mroonga
MySQLの
ストレージ
エンジン
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
ストレージエンジン
C++で実装
MySQLのハンドラーAPIを使う
ハンドラーAPIっていう名前なの?
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
ハンドラーAPI
すごくよく変わる
メジャーバージョンアップ
絶対変わる
MyNAバージョンアップ
たまに変わる
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
MySQL 8.0対応
ビルドエラー修正
API変更に対応
1.
新機能対応
新COLLATION対応とか
2.
テストをパスするようにする
ビルドができても期待通りに動くとは限らない
3.
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
制約
対応MySQL族で
Mroongaのテストを
すべてパスし続ける
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
対応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
Travis CI
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
AppVeyor
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
MySQL 8.0対応の現状
ビルドエラー修正
完了
1.
新機能対応
完了
2.
テストをパスするようにする
未完(全然おわんねーの)
3.
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
ビルドエラー修正までの道
90コミット
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
API変更パターン
ふつうのC++になった
すごくよいこと
1.
名前が変わった2.
新しいなにかが増えた3.
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
ふつうのC++
my_bool→bool
必要なヘッダーだけ#include
HASH→std::unordered_map
std::stringを使える!
autoを使える!
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
名前が変わった
型: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
対応方針
上位互換APIを用意して使う
使わない引数は単に無視
コード中で#ifしない
メンテナンスできないコードのできあがり!
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
互換型
#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
互換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
新しいなにかが増えた
dd::*が増えた
data dictionaryだって
テーブル定義の取得方法が変わった
handlerにメンバー関数追加
実装して対応しないといけない
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
対応方針
説明が面倒に
なってきたので
省略
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
新機能対応
新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
groonga-normalizer-mysql
1.1.4で全部対応!
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
テストデータ
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
確認方法
SELECT * FROM x
WHERE MATCH(a)
AGAINST('+バビブベボ' IN BOOLEAN MODE);
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
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
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
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
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
Mroongaの正規化
MySQLとはステージが違う
濁点とかひらがなとかカタカナとか小文
字とか絵文字とかそういうステージじゃ
ないから
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
使用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
使い方
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
デフォルト
AGAINST('+バビブベボ' IN BOOLEAN MODE)
-- +-----------------+
-- | a |
-- +-----------------+
-- | バビブベボ |
-- | バビブベボ |
-- +-----------------+
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_kana
-- COMMENT='normalizer
-- "NormalizerNFKC100('unify_kana', true)"'
AGAINST('+バビブベボ' IN BOOLEAN MODE)
-- +-----------------+
-- | a |
-- +-----------------+
-- | ばびぶべぼ |
-- | バビブベボ |
-- | バビブベボ |
-- +-----------------+
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
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
unify_kana_case
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
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
unify_hyphen
ハイフンっぽい文字を
-˗֊‐‑‒–⁃⁻₋−
ハイフンへ
-(U+002D)
ユースケース:電話番号検索
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_prolonged_sound_mark
長音記号っぽい文字を
ー—―─━ー
長音記号へ
ー(U+30FC)
ユースケース:電話番号検索
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_hyphen_and_
prolonged_sound_mark
ハイフンっぽい文字と
-˗֊‐‑‒–⁃⁻₋−
長音記号っぽい文字を
ー—―─━ー
ハイフンへ
-(U+002D)
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_middle_dot
中点っぽい文字を
·ᐧ•∙⋅⸱・・
中点へ
·(U+00B7)
ユースケース:外来語検索
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_katakana_v_sounds
ヴァヴィヴヴェヴォを
バビブベボへ
ユースケース:外来語検索(ワイン名)
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
unify_katakana_bu_sound
ヴァヴィヴヴェヴォを
ブへ
ユースケース:外来語検索(ワイン名)
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
オプションは組み合わせ可能
-- ワイン名検索用
-- COMMENT='normalizer
-- "NormalizerNFKC100(
-- 'unify_middle_dot', true,
-- 'unify_katakana_bu_sound', true)"'
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
トークナイザー
MySQLとはステージが違う
ゆるく検索するモード
電話番号・ワイン名検索に便利
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
ゆるく検索
loose_symbol
記号の有無に関係なくマッチ
loose_blank
空白文字の有無に関係なくマッチ
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
書き方
-- MariaDBだと↓と書ける!
-- TOKENIZER='TokenNgram("loose_symbol", true)'
-- COMMENT='tokenizer
-- "TokenNgram('loose_symbol', true)"'
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
電話番号検索例
INSERT INTO x VALUES ('(123)4567-8901');
INSERT INTO x VALUES ('123-4567-8901');
INSERT INTO x VALUES ('12345678901');
INSERT INTO x VALUES ('(123)4567−8901');
INSERT INTO x VALUES ('123 4567 8901');
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
電話番号検索例
-- 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
ワイン名検索例
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
ワイン名検索例
-- 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
テストがパスしない原因
そもそも動かない
動くけどクラッシュする
動くけど期待通りじゃない
動くし期待通りだけど期待通りじゃない
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
そもそも動かない例
mysql-test/include/*が減った
have_innodb.inc:InnoDB必須だから
not_embedded.inc:libmysqldを辞めたから
互換.incを用意
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
動くけどクラッシュする例
JSON型のカラムの更新
ラッパーモード
使っている人いる?
削除していい?
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
動くけど期待通りじゃない例
FOREIGN KEYの制約チェック
dd::*からうまく主キー情報を
取得できていない
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
動くし期待通りだけど
期待通りじゃない例
デフォルト値変更→期待結果も変わる
例:COLLATIONの変更
SHOW CREATE TABLEの結果が変わる
テスト方法・結果の変更で対応
例:非デフォルトCOLLATIONを使う
ただただ面倒
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
テストがまだパスしていない要因
テスト実行が遅くなった
JSONのやつがなんで動かなくなったか
わからん
dd::*の使い方がわからん
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
テスト実行が遅い
mysql-test-runが遅くなった
テスト実行開始まで30秒くらい
メモリー3GB食うようになった
Mroongaのテストは約770個
gdbの起動が遅くなった
mysqldのシンボル読込に15秒くらい
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
テストがパスするための支援方法
クリアコードに開発案件を発注
仕事の時間で開発できる!
MySQL 8.0でMroonga Powered by Rabbit 2.2.2
次回リリース
8月か9月の肉の日かなぁ
db tech showcase Tokyo 2018の前に
リリースできるといいなぁ

Weitere ähnliche Inhalte

Was ist angesagt?

Lucandraを使ってみる
Lucandraを使ってみるLucandraを使ってみる
Lucandraを使ってみる
Fumihiko Sato
 

Was ist angesagt? (18)

PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムPostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報
 
MroongaとPGroonga
MroongaとPGroongaMroongaとPGroonga
MroongaとPGroonga
 
Groonga族2016
Groonga族2016Groonga族2016
Groonga族2016
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化する
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
 
JAZUG #26 AKS backup with Velero
JAZUG #26 AKS backup with VeleroJAZUG #26 AKS backup with Velero
JAZUG #26 AKS backup with Velero
 
Lucandraを使ってみる
Lucandraを使ってみるLucandraを使ってみる
Lucandraを使ってみる
 
Mroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦いMroongaを使ったときの MySQLの制限との戦い
Mroongaを使ったときの MySQLの制限との戦い
 
Gossip事始め
Gossip事始めGossip事始め
Gossip事始め
 
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
 

Ähnlich wie MySQL 8.0でMroonga

Ähnlich wie MySQL 8.0でMroonga (16)

文字化け
文字化け文字化け
文字化け
 
文字化け
文字化け文字化け
文字化け
 
Mysqlの文字コード
Mysqlの文字コードMysqlの文字コード
Mysqlの文字コード
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
 
今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
Nseg49 mysql
Nseg49 mysqlNseg49 mysql
Nseg49 mysql
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
 
MHA on AWS+Rails
MHA on AWS+RailsMHA on AWS+Rails
MHA on AWS+Rails
 
20150630_MySQL勉強会
20150630_MySQL勉強会20150630_MySQL勉強会
20150630_MySQL勉強会
 
2015-01-27 Introduction to Docker
2015-01-27 Introduction to Docker2015-01-27 Introduction to Docker
2015-01-27 Introduction to Docker
 
DB HA Tool - mysqlfailover
DB HA Tool - mysqlfailoverDB HA Tool - mysqlfailover
DB HA Tool - mysqlfailover
 
Open contrail days 2014 fall
Open contrail days 2014 fallOpen contrail days 2014 fall
Open contrail days 2014 fall
 
Mysql charset
Mysql charsetMysql charset
Mysql charset
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編
 

Mehr von Kouhei Sutou

Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
Kouhei Sutou
 

Mehr von Kouhei Sutou (20)

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extension
 
PGroonga & Zulip
PGroonga & ZulipPGroonga & Zulip
PGroonga & Zulip
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!
 
株式会社クリアコード
株式会社クリアコード株式会社クリアコード
株式会社クリアコード
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

MySQL 8.0でMroonga

  • 1. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 MySQL 8.0で Mroonga 須藤功平 クリアコード MyNA会 2018年7月 2018-07-23
  • 2. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 Mroonga MySQLの ストレージ エンジン
  • 3. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ストレージエンジン C++で実装 MySQLのハンドラーAPIを使う ハンドラーAPIっていう名前なの?
  • 4. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ハンドラーAPI すごくよく変わる メジャーバージョンアップ 絶対変わる MyNAバージョンアップ たまに変わる
  • 5. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 MySQL 8.0対応 ビルドエラー修正 API変更に対応 1. 新機能対応 新COLLATION対応とか 2. テストをパスするようにする ビルドができても期待通りに動くとは限らない 3.
  • 6. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 制約 対応MySQL族で Mroongaのテストを すべてパスし続ける
  • 7. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 対応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
  • 8. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 Travis CI
  • 9. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 AppVeyor
  • 10. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 MySQL 8.0対応の現状 ビルドエラー修正 完了 1. 新機能対応 完了 2. テストをパスするようにする 未完(全然おわんねーの) 3.
  • 11. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ビルドエラー修正までの道 90コミット
  • 12. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 API変更パターン ふつうのC++になった すごくよいこと 1. 名前が変わった2. 新しいなにかが増えた3.
  • 13. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ふつうのC++ my_bool→bool 必要なヘッダーだけ#include HASH→std::unordered_map std::stringを使える! autoを使える!
  • 14. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 名前が変わった 型:st_select_lex→SELECT_LEX API: order->direction == ORDER_ASC order->direction == ORDER::ORDER_ASC order->asc
  • 15. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 対応方針 上位互換APIを用意して使う 使わない引数は単に無視 コード中で#ifしない メンテナンスできないコードのできあがり!
  • 16. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 互換型 #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;
  • 17. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 互換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)) {...}
  • 18. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 新しいなにかが増えた dd::*が増えた data dictionaryだって テーブル定義の取得方法が変わった handlerにメンバー関数追加 実装して対応しないといけない
  • 19. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 対応方針 説明が面倒に なってきたので 省略
  • 20. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 新機能対応 新COLLATION対応 utf8mb4_0900_ai_ci utf8mb4_0900_as_ci utf8mb4_0900_as_cs utf8mb4_ja_0900_as_cs utf8mb4_ja_0900_as_cs_ks
  • 21. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 groonga-normalizer-mysql 1.1.4で全部対応!
  • 22. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 テストデータ 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 ("バビブベボ");
  • 23. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 確認方法 SELECT * FROM x WHERE MATCH(a) AGAINST('+バビブベボ' IN BOOLEAN MODE);
  • 24. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 utf8mb4_0900_ai_ci ALTER TABLE x MODIFY COLUMN a text COLLATE utf8mb4_0900_ai_ci; -- +--------------------------------+ -- | a | -- +--------------------------------+ -- | はひふへほ | -- | ばびぶべぼ | -- | ハヒフヘホ | -- | バビブベボ | -- | ハヒフヘホ | -- | バビブベボ | -- +--------------------------------+
  • 25. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 utf8mb4_0900_as_cs ALTER TABLE x MODIFY COLUMN a text COLLATE utf8mb4_0900_as_cs; -- +-----------------+ -- | a | -- +-----------------+ -- | バビブベボ | -- +-----------------+
  • 26. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 utf8mb4_ja_0900_as_cs ALTER TABLE x MODIFY COLUMN a text COLLATE utf8mb4_ja_0900_as_cs; -- +-----------------+ -- | a | -- +-----------------+ -- | ばびぶべぼ | -- | バビブベボ | -- +-----------------+
  • 27. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 utf8mb4_ja_0900_as_cs_ks ALTER TABLE x MODIFY COLUMN a text COLLATE utf8mb4_ja_0900_as_cs_ks; -- +-----------------+ -- | a | -- +-----------------+ -- | バビブベボ | -- +-----------------+
  • 28. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 Mroongaの正規化 MySQLとはステージが違う 濁点とかひらがなとかカタカナとか小文 字とか絵文字とかそういうステージじゃ ないから
  • 29. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 使用Unicodeのバージョン MySQL: 9.0.0 Mroonga: 10.0.0 2018-07時点の最新Unicodeバージョン:11.0.0
  • 30. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 使い方 CREATE TABLE x ( a text, FULLTEXT INDEX (a) -- MariaDBだとNORMALIZER='NormalizerNFKC100'と書ける! COMMENT='normalizer "NormalizerNFKC100"' ) ENGINE=Mroonga;
  • 31. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 デフォルト AGAINST('+バビブベボ' IN BOOLEAN MODE) -- +-----------------+ -- | a | -- +-----------------+ -- | バビブベボ | -- | バビブベボ | -- +-----------------+
  • 32. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_kana -- COMMENT='normalizer -- "NormalizerNFKC100('unify_kana', true)"' AGAINST('+バビブベボ' IN BOOLEAN MODE) -- +-----------------+ -- | a | -- +-----------------+ -- | ばびぶべぼ | -- | バビブベボ | -- | バビブベボ | -- +-----------------+
  • 33. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_voiced_sound_mark -- COMMENT='normalizer -- "NormalizerNFKC100('unify_voiced_sound_mark', true)"' AGAINST('+バビブベボ' IN BOOLEAN MODE) -- +--------------------------------+ -- | a | -- +--------------------------------+ -- | ハヒフヘホ | -- | バビブベボ | -- | ハヒフヘホ | -- | バビブベボ | -- +--------------------------------+
  • 34. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_kana_case INSERT INTO x VALUES ("やゆよ"); INSERT INTO x VALUES ("ゃゅょ"); INSERT INTO x VALUES ("ヤユヨ"); INSERT INTO x VALUES ("ャュョ"); INSERT INTO x VALUES ("ヤユヨ"); INSERT INTO x VALUES ("ャュョ");
  • 35. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_kana_case -- COMMENT='normalizer -- "NormalizerNFKC100('unify_kana_case', true)"' AGAINST('+ヤユヨ' IN BOOLEAN MODE) -- +-----------+ -- | a | -- +-----------+ -- | ヤユヨ | -- | ャュョ | -- | ヤユヨ | -- | ャュョ | -- +-----------+
  • 36. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_hyphen ハイフンっぽい文字を -˗֊‐‑‒–⁃⁻₋− ハイフンへ -(U+002D) ユースケース:電話番号検索
  • 37. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_prolonged_sound_mark 長音記号っぽい文字を ー—―─━ー 長音記号へ ー(U+30FC) ユースケース:電話番号検索
  • 38. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_hyphen_and_ prolonged_sound_mark ハイフンっぽい文字と -˗֊‐‑‒–⁃⁻₋− 長音記号っぽい文字を ー—―─━ー ハイフンへ -(U+002D)
  • 39. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_middle_dot 中点っぽい文字を ·ᐧ•∙⋅⸱・・ 中点へ ·(U+00B7) ユースケース:外来語検索
  • 40. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_katakana_v_sounds ヴァヴィヴヴェヴォを バビブベボへ ユースケース:外来語検索(ワイン名)
  • 41. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 unify_katakana_bu_sound ヴァヴィヴヴェヴォを ブへ ユースケース:外来語検索(ワイン名)
  • 42. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 オプションは組み合わせ可能 -- ワイン名検索用 -- COMMENT='normalizer -- "NormalizerNFKC100( -- 'unify_middle_dot', true, -- 'unify_katakana_bu_sound', true)"'
  • 43. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 トークナイザー MySQLとはステージが違う ゆるく検索するモード 電話番号・ワイン名検索に便利
  • 44. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ゆるく検索 loose_symbol 記号の有無に関係なくマッチ loose_blank 空白文字の有無に関係なくマッチ
  • 45. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 書き方 -- MariaDBだと↓と書ける! -- TOKENIZER='TokenNgram("loose_symbol", true)' -- COMMENT='tokenizer -- "TokenNgram('loose_symbol', true)"'
  • 46. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 電話番号検索例 INSERT INTO x VALUES ('(123)4567-8901'); INSERT INTO x VALUES ('123-4567-8901'); INSERT INTO x VALUES ('12345678901'); INSERT INTO x VALUES ('(123)4567−8901'); INSERT INTO x VALUES ('123 4567 8901');
  • 47. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 電話番号検索例 -- 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 | -- +--------------------------------------------+
  • 48. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ワイン名検索例 INSERT INTO x VALUES ('セーヴェル エ メーヌ'); INSERT INTO x VALUES ('セブルエメーヌ'); INSERT INTO x VALUES ('セーブル・エ・メーヌ'); INSERT INTO x VALUES ('セーヴル エメーヌ');
  • 49. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 ワイン名検索例 -- 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 | -- +--------------------------------+ -- | セーヴェル エ メーヌ | -- | セブルエメーヌ | -- | セーブル・エ・メーヌ | -- | セーヴル エメーヌ | -- +--------------------------------+
  • 50. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 テストがパスしない原因 そもそも動かない 動くけどクラッシュする 動くけど期待通りじゃない 動くし期待通りだけど期待通りじゃない
  • 51. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 そもそも動かない例 mysql-test/include/*が減った have_innodb.inc:InnoDB必須だから not_embedded.inc:libmysqldを辞めたから 互換.incを用意
  • 52. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 動くけどクラッシュする例 JSON型のカラムの更新 ラッパーモード 使っている人いる? 削除していい?
  • 53. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 動くけど期待通りじゃない例 FOREIGN KEYの制約チェック dd::*からうまく主キー情報を 取得できていない
  • 54. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 動くし期待通りだけど 期待通りじゃない例 デフォルト値変更→期待結果も変わる 例:COLLATIONの変更 SHOW CREATE TABLEの結果が変わる テスト方法・結果の変更で対応 例:非デフォルトCOLLATIONを使う ただただ面倒
  • 55. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 テストがまだパスしていない要因 テスト実行が遅くなった JSONのやつがなんで動かなくなったか わからん dd::*の使い方がわからん
  • 56. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 テスト実行が遅い mysql-test-runが遅くなった テスト実行開始まで30秒くらい メモリー3GB食うようになった Mroongaのテストは約770個 gdbの起動が遅くなった mysqldのシンボル読込に15秒くらい
  • 57. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 テストがパスするための支援方法 クリアコードに開発案件を発注 仕事の時間で開発できる!
  • 58. MySQL 8.0でMroonga Powered by Rabbit 2.2.2 次回リリース 8月か9月の肉の日かなぁ db tech showcase Tokyo 2018の前に リリースできるといいなぁ