[Groonga-mysql-commit] mroonga/mroonga [master] #445 ORDER BY LIMITの高速化

Back to archive index

null+****@clear***** null+****@clear*****
2010年 11月 24日 (水) 01:22:30 JST


Kentoku SHIBA	2010-11-23 16:22:30 +0000 (Tue, 23 Nov 2010)

  New Revision: 67eb24ce6eb143ddb7c975d58b3385a5f333b8dd

  Log:
    #445 ORDER BY LIMITの高速化

  Modified files:
    doc/ja/source/reference.rst
    doc/ja/source/userguide.rst

  Modified: doc/ja/source/reference.rst (+12 -7)
===================================================================
--- doc/ja/source/reference.rst    2010-11-23 15:56:05 +0000 (a4b4b30)
+++ doc/ja/source/reference.rst    2010-11-23 16:22:30 +0000 (48c81fd)
@@ -14,12 +14,12 @@ groongaストレージエンジンのソースコードの以下のディレク
 
 ファイル一覧 ::
 
- binlog.test             drop_table.test          select_pkey.test
- btree.test              fulltext.test            select_secondary_key.test
- count_performance.test  hash.test                show_create_table.test
- create_table.test       information_schema.test  show_table_status.test
- delete.test             insert.test              update.test
- drop_database.test      select_all.test
+ binlog.test             drop_table.test               select_all.test
+ btree.test              fulltext.test                 select_pkey.test
+ count_performance.test  hash.test                     select_secondary_key.test
+ create_table.test       information_schema.test       show_create_table.test
+ delete.test             insert.test                   show_table_status.test
+ drop_database.test      order_limit_performance.test  update.test
 
 ここに記述されているSQL文が現在利用可能なSQL文となります。
 
@@ -38,4 +38,9 @@ groongaストレージエンジンのソースコードの以下のディレク
 groonga_count_skip
 ++++++++++++++++++++++++++++
 
-行カウント高速化機能が動作する度にカウントアップされます。スキーマ/SQLチューニングを行って行カウント高速化機能を利用できるようにした際の動作確認に利用できます。
\ No newline at end of file
+行カウント高速化機能が動作する度にカウントアップされます。スキーマ/SQLチューニングを行って行カウント高速化機能を利用できるようにした際の動作確認に利用できます。
+
+groonga_fast_order_limit
+++++++++++++++++++++++++++++
+
+ORDER BY LIMIT 高速化機能が動作する度にカウントアップされます。スキーマ/SQLチューニングを行って ORDER BY LIMIT 高速化機能を利用できるようにした際の動作確認に利用できます。

  Modified: doc/ja/source/userguide.rst (+34 -0)
===================================================================
--- doc/ja/source/userguide.rst    2010-11-23 15:56:05 +0000 (1743de6)
+++ doc/ja/source/userguide.rst    2010-11-23 16:22:30 +0000 (de6c021)
@@ -284,3 +284,37 @@ groongaストレージエンジンの前身であるTritonn(MySQL+Senna)では
 行カウント高速化の処理が行われる度に ``groonga_count_skip`` ステータス変数がインクリメントされます。
 
 備考:この高速化機能はインデックスを用いて実装されています。現在のところインデックスアクセスのみでレコードが特定できるパタンでのみ有効に機能します。
+
+全文検索時の ORDER BY LIMIT 高速化
+----------------------------
+
+一般的にMySQLでは"ORDER BY"はインデックス経由のレコード参照が行えればほぼノーコストで処理可能であり、"LIMIT"は検索結果が大量にヒットする場合でも処理対象を限定することでコストを一定に抑える効果があります。
+
+しかし例えば全文検索のスコアの降順+LIMITのように"ORDER BY"の処理の際にインデックスが効かないクエリの場合、検索ヒット件数に比例したコストがかかってしまうため、特に大量の検索がヒットするようなキーワード検索においてクエリ処理に極端に時間がかかってしまうケースがあります。
+
+Tritonnではこの問題に対して特に対応はできていませんでしたが、最新レポジトリではsen_records_sort関数を活用してSennaからの読み出しをスコアの降順に対応させることでSQLクエリからORDER BY句を取り除く(※スコア降順を指定していたケースに対してのみ有効)回避方法を導入しました。
+
+groongaストレージエンジンでも行カウントを高速化するための仕組みを実装しています。
+
+例えば以下のSELECT文では ORDER BY LIMIT は、groonga内で処理され、必要最小限のレコードだけをMySQLに返却しています。 ::
+
+ SELECT * FROM t1 WHERE MATCH(c2) AGAINST("hoge") ORDER BY c1 LIMIT 1;
+
+ORDER BY LIMIT 高速化の処理が行われたかどうかはステータス変数で確認することもできます。::
+
+ mysql> show status like 'groonga_fast_order_limit';
+ +--------------------------+-------+
+ | Variable_name            | Value |
+ +--------------------------+-------+
+ | groonga_fast_order_limit | 1     |
+ +--------------------------+-------+
+ 1 row in set (0.00 sec)
+
+ORDER BY LIMIT 高速化の処理が行われる度に ``groonga_fast_order_limit`` ステータス変数がインクリメントされます。
+
+備考:この高速化機能は、「select ... match against order by _score desc limit X, Y」を狙い撃ちした高速化で、現在のところ以下の条件が成立した場合に機能します。
+
+* where句がmatch...againstのみ
+* joinしていない
+* limitの指定がある
+* order byの指定がカラムである(_score、_id含む)




Groonga-mysql-commit メーリングリストの案内
Back to archive index