15

MySQL をバックエンド データベースとして使用する内部 Web アプリケーションを設計しています。データの整合性は非常に重要であるため、innoDBエンジンを外部キー制約機能に使用しています。

1 つのタイプのレコードの全文検索を実行したいのですが、それは innoDB テーブルではネイティブにサポートされていません。MyISAM外部キーがサポートされていないことと、ロックが行ごとではなくテーブルごとに行われるため、テーブルに移動するつもりはありません。

MyISAM エンジンを使用して検索する必要があるレコードのミラー テーブルを作成し、それを全文検索に使用するのは悪い習慣でしょうか? このようにして、データのコピーを検索しているだけで、そのデータに何かが起こったとしても、いつでも再作成できるため、それほど大きな問題ではありません。

それとも、これは避けるべき厄介な方法ですか?

ありがとう。

4

5 に答える 5

10

トリガーを使用して何らかのデータ同期を実行できる場合があります (使用しているバージョンの mysql がトリガーをサポートしている場合)。データがテーブルに挿入された後やテーブルから削除された後など、特定の時点で SQL の小さなスニペットを実行できます。

例えば...

create trigger TRIGGER_NAME after insert on INNODB_TABLE
insert into MYISAM_TABLE select * from INNODB_TABLE
where id = last_insert_id();

... データが INNODB テーブルに挿入されるたびに、同じデータが自動的に MYISAM テーブルに挿入されます。

于 2010-06-01T07:52:30.080 に答える
7

本当にむずかしいと思います。とはいえ、これを行う私の「おそらく誤って製品コードになる簡単なプロトタイプ」の方法は、次のようなものです。

CREATE TEMPORARY TABLE search_mirror (FULLTEXT INDEX (col1, col2, ...)) Engine=MyISAM SELECT * FROM original_innodb_table;

SELECT * FROM search_mirror WHERE MATCH(col1, col2, ...) AGAINST ('foo');

DROP TEMPORARY TABLE search_mirror;

そして、ボーナスポイントとして、あなたの好みに合ったトランザクション内ですべてを行うことができます(非永続的な接続を使用していて、接続ごとに1回しか検索しない場合は、ドロップステートメントを削除できるため、2倍のボーナスになります)。

はい、これは真のミラーリング/レプリケーションではないことを認識しています。はい、テーブルの複製は高価になる可能性があることを認識しています(ここでは比較的小さなデータセットです)。私が言ったように、迅速で汚いプロトタイプ。YMMV

于 2010-04-14T20:11:36.177 に答える
2

ミラー テーブルを作成できます。MyISAM テーブルはトランザクションを尊重しないため、これはおそらく理想的とは言えません (トランザクションが InnoDB で失敗した場合、そのトランザクションで MyISAM に加えられた変更は引き続き表示されます)。

Sphinxのような専用の全文検索システムを使用できます。これは、私が全文検索に使用したものです (私のデータベースは InnoDB であるため)。

于 2010-05-07T00:34:15.307 に答える
1

この問題の最も簡単な解決策は、実際のデータを含むテーブルへのポインタを使用して、検索に使用されるインデックステーブルを作成することだと思います。私はまったく同じ問題に直面しており、InnoDBテーブルによって提供される安心感のために、システムにMyISAMテーブルを使用したくありません。

したがって、私の問題で行うことを計画しているのは、MyISAMを使用してインデックステーブルを作成することです。これにより、インデックスを作成する情報のみを取得できます。同期はトリガーを使用して行われます。これが最も簡単な方法です。テーブル全体を複製したくないのは、多くのスペースが必要になるためです。ただし、目的のフィールドのみを複製すると、検索エンジン機能を犠牲にしてスペースが消費されます。

このインデックステーブルは、施設を検索するためのインデックスとして理解できます。他のインデックスと同様に、スペースがかかります。最適化として、このインデックステーブルに挿入されるデータは用語のみにすることができますが、この方法では、検索用の不要な単語をクリーンアップするために追加の処理が必要になります。

于 2010-09-06T15:17:29.800 に答える