2011-06-23 5 views
2

2つの異なるテーブルで2つの異なる列の全文索引付けを行う必要があります。myisamスレーブ/ゴーストテーブルを使用してinnodbでフルテキストを検索

唯一の問題は、私がinnodbを使用しており、全文索引付けを行う方法がないことです。

私は、スフィンクスなどのオプションがあることを知っていますが、オプションを見ましたが、インデックスがフルテキストの列がvarchar(20)なので、残念です。

そして、おそらく、わずか約1,000,000の行があるでしょう

「最大で」私はのthinkinだ一つの簡単なオプションは、主キーとのMyISAMを使用してインデックスを作成するvarchar型と2つのテーブルを複製することです。

どのような提案ですか?これを簡単に達成する方法はありますか?

+0

テキストデータをMyISAMテーブルに入れ、それをInnoDBテーブルにリンクする(MyISAMは参照整合性を強制しません)。 –

+0

この最初の質問は興味深いです。 – stefgosselin

+0

おかげで。非正規化は簡単ですが、私が心配しているのは、OMGのように参照整合性です。存在しない行を参照する検索結果を防ぐためにmyisamテーブルに格納された行が正常であることを確認するトランザクションまたはfキーまたはその逆。 – jjj

答えて

1

あなたのアプローチは正しいようです。

  • 興味のあるフィールド(関心のあるpkey(s)とvarchar(s))、engine myisamだけで新しいテーブルを作成します。

  • この新しいテーブルでは、必要に応じてフルテキストインデックスを作成します。

主な欠点は、この新しいテーブルをマスターテーブルと同期させることです。これを行う最善の方法は、triggersをマスター表の挿入、更新、および削除に使用することです。

さらに、エンドユーザーがフルテキストインデックス付きテーブルを改ざんするのを防ぐことができます。これはトリガーでも行うことができますが、より良い方法があります:dbユーザー(例:tg_user)を作成し、このテーブルの所有権を与えます。次に、他のユーザーに選択を除くすべてを取り消します。上記のトリガーを作成するときは、definer句を必ず使用してください。

+0

セキュリティチップをありがとう。スレーブテーブルを隔離することを考えなかった。 – jjj

0

私はシンプルなソリューションで行くことにしました:

まず、InnoDBのテーブル(マスタ)に行を挿入します。次に、その直後に行をmyisamテーブルに挿入します(トリガーではありません)。

参照整合性を保証するために、1時間程度でcronを実行します。

SELECT * 
FROM master 
WHERE master.ID NOT IN 
    (SELECT slave.ID FROM slave WHERE master.ID=slave.ID); 

SELECT * 
FROM slave 
WHERE slave.ID NOT IN 
    (SELECT master.ID FROM master WHERE slave.ID=master.ID); 

スレーブ行が存在しないマスター行を参照している場合は、削除します。

クエリは、このようなものになるだろう。

マスター行にスレーブ行が存在しない場合は、挿入します。

これは最適な解決策ではありませんが、単純です。

関連する問題