Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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...
理想
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
これでメイン...
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 全⽂検索で⼼が⿊くなる瞬間
踏むものは何度でも踏む
そして踏まない⼈は全然踏まない
⾃分で報告しないといつまでも開発者が気付
いてくれない(かも)
-
ひとりで戦ってると⼼が⿊くなっちゃう
誰かに話すと少しだけ楽になる-
あま...
だいじょう
ぶ、こわくな
いよ
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を⼤きくして結果を返して...
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...
結果発表
function query operator InnoDB
MeCab
InnoDB
2gram
InnoDB
1gram
Mroonga
TokenBgra
m
LIMIT 1c * 1w 2.94 3.24 0.74
LIMIT...
結果発表
function query operator InnoDB
MeCab
InnoDB
2gram
InnoDB
1gram
Mroonga
TokenBgra
m
ORDER
BY
1c * 1w 8.64 8.99 0.86
OR...
 
Mroonga 3.11に追加されるDATETIME型の
ORDER BY最適化
60/65
MeCabとBigramを⽐べたらMeCabのが速い
のは当たり前⽥のクラッカー
とはいえあまりにMroongaに慣れすぎていて忘れ
ていたことも思い出させてくれた
61/65
 
MroongaさんはBigramでも1⽂字検索させてくれ
てやさしい
しかも速い-
Dプラグマ便利-
Wプラグマのおかげで容量節約できてる-
Mroongaさんはあればあるだけメモリーを⾷うけ
ど、InnoDBはinnodb̲buffer̲...
 
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...
InnoDB FTS
もがんばれ
65/65
Upcoming SlideShare
Loading in …5
×

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

9,165 views

Published on

2015/04/22 MyNA(日本MySQLユーザ会)会 2015年4月

Published in: Technology
  • Be the first to comment

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

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

×