morit****@razil*****
morit****@razil*****
2006年 1月 30日 (月) 11:59:10 JST
rev75でmysql-2ind.diffというパッチファイルを新たにつけました。 これはMySQL+sennaにおいて全文検索で大量の結果がヒットした場合に 特定のクエリで応答が極端に遅くなる問題に一部対処するものです。 1. limit指定で出力を制限しても応答が遅い問題 select columns from table where match(a) against(b) limit 1000, 10 のように、オフセットに大きな値を指定するとテーブルスキャンが発生し、 応答が遅くなっていました。 2. count(*)等で件数を取得するだけでも応答が遅い問題 select count(*) from table where match(a) against(b); のように件数を取得するだけでもテーブルスキャンが発生し、 応答が遅くなっていました。 3. 全文検索以外の条件で絞り込む処理が遅い問題 select columns from table where match(a) against(b) and c like 'hoge%'; のように、全文検索以外に他のカラムに関する条件を指定した場合、 そのカラムにインデックスが張られていてもテーブルスキャンが発生し、 応答が遅くなっていました。 4. 全文検索以外の条件でソートする処理が遅い問題 select columns from table where match(a) against(b) order by c; のように、ソート条件を指定した場合、そのカラムにインデックスが 張られていてもテーブルスキャンが発生し、応答が遅くなっていました。 本パッチによって上記のクエリについてはテーブルスキャンが削減されるために、 検索速度が劇的に向上します。 動作条件 - MySQL4.0.26で動作を確認しました。他の版では動作未確認です。 - 上記4つのクエリパタン以外では効果が得られるとは限りません。 全文検索条件で大量のレコードがヒットすることによって発生する ディスクI/Oが性能阻害要因である場合にのみ効果が期待できます。 - in boolean modeは未サポートです。 - 本パッチはまだα版です。MySQLの安定性に及ぼす影響等は未確認です。 使い方 - mysqlをbuildする時に、mysql.*.senna.diffを当てた後に、 mysql-2ind.diffをさらに当てます。それからmakeします。 - 1. 2.のパタンについては、特に意識することなく、 通常通りにSQLを発行するだけで本パッチの効果が得られます。 - 3. 4.のパタンについては、絞り込みやソート時に使用したいインデックスを 以下のように明示的に指定する必要があります。 select columns from table force index(c) where match(a) against(b) and c like 'hoge%'; select columns from table force index(c) where match(a) against(b) order by c; (主キーであれば force index(PRIMARY) のように指定します) 今後の予定 - 安定性を確認し、mysql.*.senna.diff とマージします。 - 対応するクエリパタンを増やします。 - in boolean mode もサポートします。 -- morita