null+****@clear*****
null+****@clear*****
2011年 6月 28日 (火) 12:13:26 JST
Kouhei Sutou 2011-06-28 03:13:26 +0000 (Tue, 28 Jun 2011) New Revision: 1cdad5c7e70f351ade55d53f3c2252600bdf2fc4 Log: [dco] add note about wrapper mode. Modified files: doc/ja/source/userguide/wrapper.rst Modified: doc/ja/source/userguide/wrapper.rst (+46 -0) =================================================================== --- doc/ja/source/userguide/wrapper.rst 2011-06-27 22:27:22 +0000 (3908da3) +++ doc/ja/source/userguide/wrapper.rst 2011-06-28 03:13:26 +0000 (f27ae38) @@ -178,3 +178,49 @@ groongaストレージエンジンではデフォルトでログの出力を行 1. ``groonga.log`` ファイルの名前を変更(OSコマンドのmvなどで) 2. MySQLサーバに対して"FLUSH LOGS"を実行(mysqlコマンドあるいはmysqladminコマンドにて) + +注意点 +------ + +0.7でのラッパーモードの実装はMySQLのストレージエンジンAPIを実直に利用したものになっています。そのため、「全文検索結果で結果レコードを絞り込むことにより不要なレコードアクセスを減らし、全文検索結果を用いた高速な検索を実現する」ということができません。これはMySQLのストレージエンジンAPIの制限なのですが、0.8では解消し、高速に検索できるようにする予定です。 + +0.7での動作と0.8で予定している動作の概要は以下の通りです。 + +0.7での動作 +^^^^^^^^^^^ + +0.7ではMySQLのストレージエンジンAPIに素直に従った実装になってるため、全文検索結果を有効に活用しきれていません。MySQLのストレージエンジンAPIに従った場合の動作を以下に示します。 + +サンプルクエリは ``SELECT * FROM users WHERE users.age >= 20 AND MATCH(description) AGAINST("趣味");`` とします。 + +1. MySQLはクエリのうち全文検索条件の部分「 ``MATCH(description) AGAINS("趣味")`` 」だけで検索するようにgroongaストレージエンジンに依頼します。 +2. groongaストレージエンジンはMySQLから渡された条件で全文検索を行います。 +3. MySQLはクエリから全文検索条件の部分「 ``MATCH(description) AGAINS("趣味")`` 」を取り除いたクエリ「 ``SELECT * FROM users WHERE users.age >= 20`` 」で検索するようgroongaストレージエンジンに依頼します。 +4. groongaストレージエンジンはMySQLから渡された条件で検索するようにラップしているストレージエンジンに依頼します。 +5. MySQLはgroongaストレージエンジンにマッチしたレコードを順に返すように要求します。 +6. groongaストレージエンジンはラップしているストレージエンジンからレコードを順に取り出してMySQLに返します。このとき返すレコードは「 ``users.age >= 20`` 」にマッチしたレコードです。「 ``MATCH(description) AGAINS ("趣味")`` 」での絞り込みは行われていません。 +7. MySQLはgroongaストレージエンジンから返ってきたそれぞれのレコードについて、全文検索結果のスコアを問い合せます。 +8. groongaストレージエンジンは各レコードについて「 ``MATCH(description) AGAINS ("趣味")`` 」がヒットしていればスコアを返し、そうでなければ「ヒットしなかったという特別なスコア」を返します。 +9. MySQLはgroongaストレージエンジンが返したスコアを確認し、「ヒットしなかったという特別なスコア」が返されたレコードを検索結果から除去します。この時点ではじめて全文検索結果がレコードの絞り込みに使われます。 +10. MySQLはgroongaストレージエンジンが返したレコード(= ラップしているストレージエンジンが返したレコード)から、「 ``MATCH(description) AGAINS ("趣味")`` 」にヒットしなかったレコードを削除したものをクライアントに返します。 + +このうち、6.のところで全文検索結果を反映したレコードのみを返すことができれば余計なレコードアクセスが減り、より高いパフォーマンスをだせます。しかし、MySQLのストレージエンジンAPIでは「全文検索以外の条件でレコードを取得した後に全文検索結果を参照してレコードをフィルターする」という動作のためせっかくのgroongaの高速な全文検索機能を活かしきれていません。 + +0.8での動作 +^^^^^^^^^^^ + +0.8ではMySQLのストレージエンジンAPIの制限を回避し、全文検索結果を有効に活用した高速な検索を実現する方法を実装する予定です。予定している実装方法を以下に示します。 + +サンプルクエリは ``SELECT * FROM users WHERE users.age >= 20 AND MATCH(description) AGAINST("趣味");`` とします。 + +1. MySQLはクエリのうち全文検索条件の部分「 ``MATCH(description) AGAINS("趣味")`` 」だけで検索するようにgroongaストレージエンジンに依頼します。 +2. groongaストレージエンジンはMySQLから渡された条件で全文検索を行います。 +3. MySQLはクエリから全文検索条件の部分「 ``MATCH(description) AGAINS("趣味")`` 」を取り除いたクエリ「 ``SELECT * FROM users WHERE users.age >= 20`` 」で検索するようgroongaストレージエンジンに依頼します。 +4. groongaストレージエンジンはMySQLから渡されたクエリに全文検索でヒットしたレコードで絞り込む条件「 ``id IN (1, 3, 4, ...)`` 」を追加したクエリ「 ``SELECT * FROM users WHERE users.age >= 20 AND id IN (1, 3, 4, ...)`` 」で検索するよう、ラップしているストレージエンジンに依頼します。 +5. MySQLはgroongaストレージエンジンにレコードを順に返すように要求します。 +6. groongaストレージエンジンはラップしているストレージエンジンからレコードを順に取り出してMySQLに返します。このとき返すレコードは「 ``users.age >= 20 AND id IN (1, 3, 4, ...)`` 」にマッチしたレコードなので、「 ``MATCH(description) AGAINS ("趣味")`` 」での絞り込み結果も反映されています。 +7. MySQLはgroongaストレージエンジンから返ってきたそれぞれのレコードについて、全文検索結果のスコアを問い合せます。 +8. groongaストレージエンジンは各レコードについて「 ``MATCH(description) AGAINS ("趣味")`` 」で検索した結果のスコアを返します。 +9. MySQLはgroongaストレージエンジンが返したレコードをクライアントに返します。 + +ポイントは4.の「全文検索でヒットしたレコードで絞り込む条件」を追加している部分です。これで「全文検索条件での絞り込みで無駄なレコードアクセスを減らすことができない」というMySQLのストレージエンジンAPIの制限を回避することができます。これにより、全文検索結果を用いて無駄なレコードアクセスを減らすことができるため、高速な全文検索を実現できます。