2011-11-25 11 views
7

私のアプリケーションで使用したいMySQLデータベースの機能は2つあります。最初はフルテキスト検索とトランザクションです。MySQLストレージエンジンのジレンマ

ここでのジレンマは、1つのストレージエンジンでこの機能を使用できないことです。 MyIsam(FULL-TEXT-SEARCH機能を備えています)またはInnoDB(TRANSACTION機能をサポート)を使用しています。私は両方を持つことはできません。

私の質問では、2つのストレージエンジンのどちらかを選択する前に、アプリケーションに両方の機能を持たせることができますか?

+1

[Sphinx](http://sphinxsearch.com/)や[Solr](http://lucene.apache.org/solr/)のようなものを使用して、任意のMySQLデータベースをインデックス付けして検索することができます。その後、InnoDBを使用することができます。 –

+0

それが正しいルーシーです。私はwudが私の唯一の選択肢だと思った。すぐに返信してくれてありがとう – burntblark

+0

ただinnodbを使ってください。ほとんどの作業を行うキャッシュを信頼すれば、フルテキスト検索は必要ありません。 –

答えて

10

回避策:

  1. 使用スフィンクスやSolrのか、テキスト検索のためのいくつかの他の外部テキスト検索エンジンとInnoDBエンジンを使用します。

  2. InnoDBを使用してください。検索ニーズが限定されていたり、予算が膨大でない限り、これは実際の選択肢ではありません。

  3. MyISAMとInnoDBの両方のエンジンを使用します。 MyISAMでは全文検索を、残りの列はInnoDBに保存します。これは、MyISAMのデータがトランザクションセーフではないため、危険です。

  4. MyISAMとInnoDBの両方のエンジンを使用します。すべてのデータをInnoDBに保存し、MyISAMで全文検索を行うカラムを複製します。これには、データの複製にいくつかのメカニズム(トリガー)が必要です。

  5. InnoDBやその他のトランザクションエンジンでフルテキスト検索がサポートされるバージョンのMySQLを待ちます。

  6. (オプション4)が、「クラッシュセーフ」(まだないトランザクションセーフ)のフルテキストインデックスがあるMariaDB(MySQLのフォーク)を使用します。フル持つPostgreSQLのようなWhen-will-transactional-fulltext-indexes-be-ready?

  7. 使用する他のRDBMSをトランザクションエンジンでの-textサポート

+1

+1素敵な概要。フルテキスト要件がいくつかの列にローカライズされている場合は、オプション4で成功しました。 – grossvogel

+0

+1、btw、オプション5は予測された日付を持っていますか、単に推測していますか? – Drew

+1

@AndrewHeath:いいえ、私は予想される日付については考えていません。 MySQL(InnoDB)フォーラムまたはMariaDBフォーラムで尋ねることができます。 –

2

同じデータベースエンジンで両方を使用する方法はありませんが、これはMySQLがどのように動作するかという設計上の制約です。物理学を変更することはできません。 ;-)

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html

あなたは設計段階ではまだしているとき、あなたはまた、両方とも同じエンジンでサポートし、プロジェクトのための別のSQL implmentationを使用して検討することができます。たとえば、Postgresがそうです。

http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL_2009#Transactions_and_the_Database_Engine_Core

+1

ありがとうKaii ...私は来るPostgre :)。 – burntblark

+1

これは物理学とは何が関係しているのかよく分かりませんが、ここではあなたのために光よりも速いニュートリノがあります:http://blogs.innodb.com/wp/2011/07/innodb-fts-performance/ –

+0

@Michael:ごめんなさい"物理学"と一緒にスマイリーを忘れてしまった。私はそれを修正した。 innodbを読むのは素早くフルテキストをサポートしていますが、メジャーディストリビューションのmysqlパッケージで利用可能になるまで待たなければなりません。 – Kaii

5

あなたはMySQLで、単一のテーブルに対して取引とフルテキストを実行する必要がある場合は、いくつかのオプションがあります。しかし、実際にこの議論全体を取り除くための顕著な点は、データベースがフルテキスト検索(特にMySQL!)を行うのがうまくいかず、理想的にはこのタイプを実行する上でより良いコンポーネントにこの作業をオフロードしたいということですタスクの

オプション1:

あなたはInnoDBのように対して取引を行い、その後、あなたはに対して全文検索を行うことができますMyISAMのある別の「ミラー」の表を作成する必要がある1つのテーブルを作成します。 InnoDBテーブルにトリガを使用することで、データを同期した状態に保つことができます。一種のハックだが動作する。

オプション3:

SphinxLuceneまたはSolrのようなサードパーティ製のフルテキストエンジンを見てみましょう。このようにして、データのクエリに最適なデータベースを設計し、テキスト検索を強制しないようにデータベースを設計することに集中できます。

オプション3:

あなたはこのようなSQL Serverなど、同時に異なるトランザクションをサポートしているデータベース・サーバとフルテキスト検索に行くことを選択することができます。

これはあなたにある程度の明確さを与えます。

お楽しみください!

+1

フルテキストインデックスではなく検索エンジンを使用するのは完全です異なるアプローチ - どちらにも利点と欠点があります。他のデータベースエンジンと比較して、他の検索エンジンにもうまく収まるかもしれません:http://jayant7k.blogspot.com/2006/05/mysql-fulltext-search-対lucene.html – Kaii

3

MyISAMのフルテキストインデックスは、おそらくあなたが思うほど良くありません。小さなデータでは正常に動作しますが、大きなデータでは問題ありません。

MySQL 5.6では、InnoDBでフルテキストが表示されることがありますが、実際のフルテキスト検索エンジンのほとんどの機能はサポートしていません。

1

一つ別のオプションは、複製のためのMySQLのサポートを使用することです:

例えばInnoDBストレージエンジンを持つことができますセットアップマスターサーバー。次に、MyISAMストレージエンジンを備えた別の読み取り専用サーバに複製します。

ほとんどのMySQLストレージエンジンを使用できます。一部のユースケースでは、MyISAMよりも優れた検索機能をサポートするものもあります。

関連する問題