MySQLでの大きなテーブルの列(複数可)(> 10.000.000行)にワイルドカード検索
質問
どのtechniqesあなたは、MySQLで非常に大きなテーブルの列内のコンテンツの検索を実装するために使用するのでしょうか?あなたは、データベース内のテーブルに保存されている10.000.000電子メールを持っており、メールの件名に存在した1つ以上の単語を検索するために私を可能にする被写体探索を実現したいというインスタンスに対して言います。ユーザーは「クリスマスサンタ」で検索した場合、あなたは「サンタが今年のクリスマス、私たちを訪問」や「クリスマスには、サンタが今まで表示されます」。
のような科目を含む電子メールを見つける必要があります 私は単語列に一意のインデックスを持っている。ここで、私の考えでは、被験者にすべての単語を処理する(すべての数字、特殊な兆候、コンマなどを除去)し、インデックステーブル内の各単語を保存することです。それから私は、多くの関係テーブルに多くの人に電子メールのテーブルにそれをリンクする。
非常に大きなテーブルの上にワイルドカード検索を実行するためのより良い方法はありますか?
ネイティブに検索し、この種のをサポートし、データベースがありますか?
解決
あなたはFULLTEXTインデックスを使用することができます。しかし、一般的にMySQLはテキスト検索と非常に良いではありません。
より良いオプションは、次のような Luceneのの専用のテキストインデックスソリューションで行くことになりますまたはスフィンクスに。個人的に私はスフィンクスをお勧めします - それはPHPとMySQLとの偉大な統合を持っており、非常に、非常に高速である(でも、通常のクエリをスピードアップするために使用することができます - 非常に高速なグループ化と順序付けを実行します)。
ここを -ウィキペディアは異なるインデックスエンジンの素敵なリストを持っています。
他のヒント
MySQLのMyISAMテーブルは FULLTEXT
のインデックスをサポート、検索のこの種に役立ちます。
しかし、それは、検索のこの種のために利用可能な最速の技術ではありません。そして、あなたはInnoDBテーブルに格納されたデータにそれを使用することはできません。
私はスフィンクス検索するに関するいくつかの良いものを聞いたが、私はまだそれを使用していません。
ここでスフィンクスについての別のブログだ: http://capttofu.livejournal.com/13037.html
、私は<のhref =「http://lucene.apache.org/java/docs/」のrel = "nofollowのような検索エンジンになるように設計何かを使用して見てしまう疑いnoreferrer "> Luceneのでます。
このは、SQL Serverがサポートするフルテキスト検索、のような音ます。
しかし、あなたのアイデアは、一般的に健全です。あなたは効果的に検索をスピードアップするために、事前にあなたのテーブルの上に「インデックス」を計算しています。
"全文検索を" チェック中MySQLのドキュメント(私の知る限り、現在のすべてのDBMSがこれをサポート)