« 夢屋が終了してた | メイン | 少し運動してみた »

2007年07月23日

MySQL のインデックスに Tritonn の機能を

MySQL では、1テーブルにつき1インデックスしか使用できないという制約がある(作成は出来る)。そのため、高速な問い合わせを可能にするには WHERE, ORDER で出現する全てのカラムの組み合わせで、マルチカラムインデックスを作成する必要がある。

その問題を回避するためだけにでも Tritonn (Senna) を導入する価値がありそう。ベータ段階ではあるが、「2ind機能」が複数のインデックスを利用可能にする。最新の MySQL 5 にも同等機能が実装されているが、微妙に使いにくい(WHERE, ORDER でまたげないのが致命的)。

MySQLが全文検索用のインデックスと通常のインデックスの両方を併用できるようにする2ind機能が利用できます。

「全文検索用のインデックス」となっているが、その他のインデックスとの組み合わせでも作動を確認した。ソートの際に、マルチカラムインデックスを準備する必要が無い(もちろん完全な作動を保障していない)。

・試したクエリ

SELECT
  *
FROM
  book
    FORCE INDEX(review)
WHERE
  price < 800
ORDER BY
  review;

price, review は、別々にインデックスを作成している(マルチカラムインデックスではない)。更なる検証は後日行うつもり(まさに必要としているので検証せざるを得ない)。まずは、他の検証例を探してみますか。

自分で Senna のインストールをしたことが無いので、自己環境の整備が急務。

※追記

低速になるクエリ文を見つけた。保障していない作動だろうか。

・低速になる例

SELECT
  *
FROM
  book
    FORCE INDEX(review)
WHERE
  price = 800
ORDER BY
  review;

MySQL のインデックスで完全一致を行った後、パッチの機能を用いてソートするとインデックスを利用しない場合(FORCE INDEX 未使用時)よりも低速になる。件数にもよるのだろうか。インデックスの利用は key_buffer_size あたりの値も影響するので、切り分けが面倒…。

【関連情報】
・Tritonn機能紹介 - Tritonnプロジェクト
 http://qwik.jp/tritonn/feature.html
・6.2.6. インデックス結合最適化 - MySQL
 http://dev.mysql.com/doc/refman/5.1/ja/index-merge-optimization.html
・MySQL5からのインデックス結合で1テーブル複数インデックスを使う - ウノウラボ
 http://labs.unoh.net/2007/06/mysql5.html

2007年07月23日 03:30 | Technology

トラックバック

コメント