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含む)