LIKEを使用して、部分一致(%検索単語%)をするよりも全文検索の方が処理速度が高速だという情報を得たため、試してみました。
テストデータは、夏目漱石の「吾輩は猫である」を句点区切りにしたデータを入れています。
データ件数は、9115件で、文字数は、32万8000文字程度です。
Dockerコンテナ立ち上げ時に自動でデータが入るので、興味ある方試してみて下さい。
プロジェクト配下に移動し、以下のコマンドを実行することで立ち上がります。
docker-compose up -d
立ち上げた後、以下のリンク先にアクセスすることができます。
phpMyAdmin
何度か実行することで多少ブレはあるものの上記のような結果になりました。
短い単語の場合、LIKE検索の方が速く、
長い文字列の場合、全文検索の方が速いという結果になりました。
N-gramを使用しているため、バイグラムでの検索処理が影響しているのかもしれません。
「名前はまだ無い。」もしくは「吾輩」が含まれている文章を検索
両方の単語を入れたOR検索の場合は、LIKE検索の方が速いという結果になりました。
LIKE検索の実行結果が、検索条件が増えているにも関わらず"「名前はまだ無い。」が含まれている文章を検索"の実行速度よりも検索速度が速いのに違和感を覚えました。
もしかしたらOR以降の吾輩の部分の速度のみが計測されたのではないかと思い、順番を入れ替えてみましたが、速度にあまり変化は見られませんでした。謎すぎる。
「名前はまだ無い。」を検索する場合、「名前」「前は」「はま」「まだ」「だ無」「無い」「い。」のインデックスが作成され、インデックスとの合致数が多い場合に、検索結果にヒットする仕組みです。
デフォルトでは、バイグラムであり、2文字に分割していますが、設定により変更することができます。
注意点として、分割して作成したインデックスの文字数より短い単語を検索することができなくなります。
デフォルトでは、2文字分割のため、1文字での検索が行えないということです。
オプションをつけない場合には、IN NATURAL LANGUAGE MODEが適用され、類似性のあるものヒットします。
LIKEでの部分一致と同じ動作にするためには、より厳格な検索を必要とするため、前述ではIN BOOLEAN MODEを使用しています。