現行の制限事項について

これまでいくつかのパタンについては内部的に回避する実装を追加してきているのですが、frmファイルにアクセスするような処理はいまでもいくつかUSING句情報が落ちるものがあります。

例えば以下のようにテーブルを定義しているものとします。

CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM, 1024 (c1)) DEFAULT CHARSET utf8;

この時、以下のどれかの処理を行うと、USING以下で指定した情報(ここではindex_type=NGRAMとinitial_n_segments=1024)が落ちます。

  • TRUNCATE TABLE t1
  • CREATE TABLE t2 LIKE t1
  • REPAIR TABLE t1 USE_FRM

具体的には、SHOW SENNA STATUSで確認すると以下のようになってしまいます。

[test] > show senna status\G
*************************** 1. row ***************************
                  Table: t1
               Key_name: ft
            Column_name: c1
               Encoding: euc_jp
             Index_type: MECAB
              Normalize: OFF
            Split_alpha: OFF
            Split_digit: OFF
           Split_symbol: OFF
     Initial_n_segments: 512
        Senna_keys_size: 1
   Senna_keys_file_size: 8462336
     Senna_lexicon_size: 15
Senna_lexicon_file_size: 12656640
     Senna_inv_seg_size: 430080
   Senna_inv_chunk_size: 135168
1 row in set (0.00 sec)

index_typeがMECABに、normalizeがOFFに、initial_n_segmentsが512となってしまいます。

現在、Tritonn(MySQL+Sennaパッチ)ではUSING句以下の情報をfrmファイルには保存せず、アクセス時に適宜、SEN系ファイルからsen_index_info関数を通じて取得するという実装方法を採っているのですが、そのためMySQLが内部でfrmファイルから取得した情報を使ってインデックスの作成を行うような場合に、このようなことになっています。

これまでは、例えばALTER TABLEなどのいくつかのパタンについては、MySQLがfrmファイルから情報を取得した直後のタイミングで内部的にsen_index_infoを追加呼出しして情報を補完するような実装を追加して少しずつ対処してきていました。

これを今後、frmファイルを使う方法に行くか、駄目パタンを少しずつ潰していく現行の方法を維持するかについてはまだ議論の余地があると思っているのですが、とりあえず上記については今日時点では対応できていません。

回避方法としては、上記のようなクエリを別のクエリで代替できるならそっちを使うか、あるいは上記クエリを使用するならその後にALTER/DROP/CREATEでUSING句情報を明示してインデックスを再作成して下さい。

尚、Tritonnの制限事項については以下のページにまとめていますので、気になった時にチェックしてみてください。
http://qwik.jp/tritonn/limitation.html