MySQLの全⽂検索に関するあれやこ
れや
InnoDB FTSだけが新機能だと思うな
2015/04/22
yoku0825
MyNA(⽇本MySQLユーザ会)会 2015年4⽉
MySQL 5.7.7-
rc おめでとうご
ざいます
1/65
…で思い出し
たんですが
2/65
思い起こせば2年前
MySQL clients 3/65
初MyNA
会…
4/65
懐かし
い。
5/65
MySQL de
全⽂検索
6/65
⼈類は何故、
MySQLで全⽂検索
をしたいのだろう
7/65
elasticsearch
派のひとー
8/65
Solr派の
ひとー
9/65
Groonga
派のひとー
10/65
残りはみんな
Namazu派です
ねわかりますん
11/65
MySQL de 全⽂検索
MySQLのレプリケーションに載せちゃえばリード
レプリカ作るのが超簡単
SPIDERを使えばシャーディングも超簡単
そういえばMariaDBのSPIDERってまだ
Engine Condition Pushdownできないの︖
(最近調べてない)
-
マスターはInnoDBで⽂書厳重保管、スレーブは
Mroongaで全⽂検索とか簡単
⽂書保管と全⽂検索と2か所に書くのは真⾯目
にやろうとすると複雑
-
12/65
理想
13/65
現実
14/65
どうしてこう
なった。。:
(;゙゚ʼω゚ʼ):
15/65
MySQL de 全⽂検索
古来より伝わるMyISAMの秘法
分かち書きは⾃前で対応-
16/65
MySQL de 全⽂検索
輝かしいTritonnの秘跡
MyISAM FTSのインデックス部分だけをSenna
にすり替えるパッチで分かち書きを省略
-
17/65
MySQL de 全⽂検索
たまに荒ぶるMroonga
MySQLのFTSはパーサーだけを使い、完全なス
トレージエンジンとして実装
-
18/65
MySQL de 全⽂検索
InnoDB FTS そして伝説へ
「MyISAMでできることはすべてInnoDBでもで
きるように」
-
19/65
もちろん分か
ち書き⾃前対
応
20/65
そりゃそうだ
ろうと思って
た
21/65
が
22/65
MySQL 5.7.6-m16
ngram/MeCab
FullText Parser.
23/65
 
Σ(゚д゚lll) ばんなそかな
とはいえ5.1からFullText Parser⽤のAPIはあった
MySQL :: MySQL 5.1 Reference Manual ::
22.2.3 Types of Plugins
これでメイン系と全⽂検索系で謎の重複スキーマで
謎のXAモドキをしなくても済む︕︖
24/65
InnoDB FTS with
ngram parser
VS
Mroonga TokenBigram
Casual
25/65
ファイッ
26/65
の前に
27/65
MySQLで全⽂検
索するために絶対
に必要になる知識
28/65
これだけは記憶
に留めて帰って
いただきたい
29/65
じらいともだ
ちはだいじ
30/65
ばぐれぽ
もだいじ
31/65
bugs.mysql.com
32/65
bugs.mysql.com
33/65
bugs.mysql.com
34/65
MySQL Bugs:
#76164: InnoDB
FTS with MeCab
parser prints empty
error message
35/65
Mroongaの場合
36/65
Mroongaの場合
37/65
Mroongaの場合
38/65
MySQL de 全⽂検索で⼼が⿊くなる瞬間
踏むものは何度でも踏む
そして踏まない⼈は全然踏まない
⾃分で報告しないといつまでも開発者が気付
いてくれない(かも)
-
ひとりで戦ってると⼼が⿊くなっちゃう
誰かに話すと少しだけ楽になる-
あまつさえ解決のためにいろいろ教えてくれた
り
-
39/65
だいじょう
ぶ、こわくな
いよ
40/65
僕と結託して
地雷友達にな
ってよ︕
41/65
\こんばんわ/
yoku0825@GMOメディア株式会社
オラクれない-
ポスグれない-
マイエスキューエる-
家に帰ると
妻の夫-
せがれの⽗-
ムスメの⽗-
Twitter: @yoku0825
Blog: ⽇々の覚書 42/65
InnoDB FTS with
ngram parser
VS
Mroonga TokenBigram
Casual
43/65
本番投⼊⽤のDBの
ハコに本番のデー
タを突っ込んで準
備
44/65
ファイッ
45/65
2⽂字 * 1単語
46/65
1⽂字 * 1単語
47/65
 
そういえばBigramって本来1⽂字の単語検索でき
ないよね︕︖
MroongaのTokenBigramは検索できるように前⽅
⼀致検索に書き換えてくれるらしいのですごく親
切。
48/65
2⽂字 * 2単語 (IN BOOLEAN AND検索)
49/65
 
InnoDB 1gramはERROR 188 (HY000): FTS
query exceeds result cache limitって⾔って結果
返してくれなかった。。
innodb̲ft̲cache̲sizeを⼤きくして結果を返して
くれたとしても、20分くらい黙ってからエラーが
返ってくる時点でレスポンスはお察しかな。。
50/65
2⽂字 * 2単語 (IN BOOLEAN MODE OR検
索)
51/65
1⽂字 * 2単語 (IN BOOLEAN MODE AND
検索)
52/65
Unigram
だからさ
53/65
1⽂字 * 2単語 (IN BOOLEAN MODE OR検
索)
54/65
カンカンカーン
55/65
NOT検索とか
TokenMecabとか⽐
べなくてもいいですよ
ね︖ (やってない)
56/65
結果発表
function query operator InnoDB
MeCab
InnoDB
2gram
InnoDB
1gram
Mroonga
TokenBgra
m
COUNT 1c * 1w 2.29 2.19 0.74
COUNT 1c * 2w AND 2.62 3.74 0.74
COUNT 1c * 2w OR 3.02 3.78 0.90
COUNT 2c * 1w 0.02 0.70 3.04 0.17
COUNT 2c * 2w AND 0.07 1.74 N/A 0.27
COUNT 2c * 2w OR 0.08 1.80 N/A 0.39
SELECT COUNT(*) FROM t1 WHERE match(..)
against(..);
57/65
結果発表
function query operator InnoDB
MeCab
InnoDB
2gram
InnoDB
1gram
Mroonga
TokenBgra
m
LIMIT 1c * 1w 2.94 3.24 0.74
LIMIT 1c * 2w AND 2.68 3.99 0.75
LIMIT 1c * 2w OR 4.12 5.13 0.90
LIMIT 2c * 1w 0.04 0.98 3.84 0.16
LIMIT 2c * 2w AND 0.08 1.83 N/A 0.26
LIMIT 2c * 2w OR 0.12 2.35 N/A 0.40
SELECT * FROM t1 WHERE match(..) against
(..) LIMIT 3;
58/65
結果発表
function query operator InnoDB
MeCab
InnoDB
2gram
InnoDB
1gram
Mroonga
TokenBgra
m
ORDER
BY
1c * 1w 8.64 8.99 0.86
ORDER
BY
1c * 2w AND 2.78 5.91 0.83
ORDER
BY
1c * 2w OR 9.42 11.88 1.10
ORDER
BY
2c * 1w 0.14 2.91 8.76 0.25
ORDER
BY
2c * 2w AND 0.09 2.72 N/A 0.31
ORDER
BY
2c * 2w OR 0.28 5.29 N/A 0.48
SELECT * FROM t1 WHERE match(..) against
(..) ORDER BY another̲column DESC LIMIT 3; 59/65
 
Mroonga 3.11に追加されるDATETIME型の
ORDER BY最適化
60/65
MeCabとBigramを⽐べたらMeCabのが速い
のは当たり前⽥のクラッカー
とはいえあまりにMroongaに慣れすぎていて忘れ
ていたことも思い出させてくれた
61/65
 
MroongaさんはBigramでも1⽂字検索させてくれ
てやさしい
しかも速い-
Dプラグマ便利-
Wプラグマのおかげで容量節約できてる-
Mroongaさんはあればあるだけメモリーを⾷うけ
ど、InnoDBはinnodb̲buffer̲pool̲sizeで制御で
きる
62/65
 
InnoDB FTSやるならMeCab⼤前提
スコア順に並べる以外のことはしない⽅がいい
ファイルソートが無視できるサイズを超える
と悲惨
-
あと地味にmysqlbinlog便利
63/65
Mroongaはノーマライザーがすてき
カタカナCI 拗⾳促⾳CI ハハパパCI 全角半角CI 寿司ビアCI
utf8̲bin no no no no no
utf8̲gene
ral̲ci
no no no no yes
utf8̲unico
de̲ci
yes yes yes yes yes
Normalizer
MySQLGen
eralCI
no no no no no?
Normalizer
MySQLUni
codeCIExc
eptKanaCI
KanaWith
VoicedSou
ndMark
yes no no yes no?
groonga/groonga-normalizer-mysql 64/65
InnoDB FTS
もがんばれ
65/65

MySQLの全文検索に関するあれやこれや