mail_babir****@yahoo*****
mail_babir****@yahoo*****
2013年 4月 22日 (月) 21:02:43 JST
お世話になっております。
田辺です。
> 以下のように2つのインデックスを作成し、
>
> FULLTEXT INDEX (`main`) COMMENT 'parser "TokenDelimitNull"',
> INDEX (`grp`),
>
> 以下のように検索すると、
>
> SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('とらっく*' IN BOOLEAN MODE) AND `grp` = 'tag';
>
> どちらのインデックスも使っているようにみえました。
> (デバッグビルドにしてどのメソッドが呼ばれているか確認してみ
> た。)
>
> もし、そこそこのデータをすでに持っているのであれば、
> 「INDEX (`grp`)」ありなしで検索時間を比較することでインデッ
> クスが使われているかどうかを確認できます。インデックスが使わ
> れていると、ありなしで10倍くらい速度が変わります。ありなしで
> 速度が変わらない場合はインデックスが使われていません。
MySQLの仕様では、基本的に単一インデックスが2つ設定されていても、より効率的な方を使用するだけで、両方を使用するものではなかったかと記憶しています。
いただいたクエリのexplain文を発行して見たところ、possible_keys欄にはmain,grpの2インデックスが候補として挙ってはいますが、key欄にはmainと表示されており、MySQL上ではmainインデックスのみが使用されているようでした。
上記条件にて10000レコードほどに対しての検索速度を調べましたが、grpインデックスの有無によらず、ほぼ変化はなく、同一内容のMyISAMテーブルに対しても検索速度を調べましたが、こちらもgrpインデックスの有無によらず、同様の結果となりました。
かわって、複合インデックスを貼ってのLIKE検索にしたところ、mroongaは5〜10倍ほど速くなり、MyISAMは1.3倍ほど速くなりました。
mroongaにおいてはおそらく初めてインデックスが使われるようになって高速化したものと思います。
また、引き続き全文検索について、MyISAM(utf8_unicode_ci)とmroongaでベンチマークを取っていたところ、mroonaについてはutf8_roman_ciなどで従来のノーマライズ方式を使っている場合にはMyISAMと同等の速度となっていましたが、utf8_general_ciやutf8_unicode_ciを使った場合には平均で10倍ほど遅くなっているようでした。
ノーマライズ処理で10倍の劣化は無さそうですので、特定の照合順序を指定した場合のみインデックスが適切に使用されていない可能性があるかと思います。
一度ご検証頂けますと幸いです。
田辺公平