MySQLデータベースの英文辞書が250Kをわずかに超える英文辞書があり、単純なルビのフロントエンドを使ってその先頭にワイルドカードを使用して検索しています文字列。これまでのところ、私はこのようにそれを行ってきた:250K +文字列のワイルドカード検索のための高速な方法
SELECT * FROM words WHERE word LIKE '_e__o'
あるいは
SELECT * FROM words WHERE word LIKE '____s'
私はいつも言葉の正確な長さを知っているが、単一の文字が、すべては潜在的に未知です。
これは糖蜜よりも遅く、先頭のワイルドカードのない類似のクエリよりも約15倍遅くなります。これは、その列のインデックスを使用できないためです。
私は、検索の範囲を狭めるいくつかの方法を試しました。たとえば、私は各単語の個々の文字数を含む26の追加の列を追加し、それらを最初に使って検索を絞り込みました。私も単語の長さで絞り込みを試みました。これらのメソッドは、ワイルドカード検索の本質的な非効率性のおかげでほとんど違いはありませんでした。私はさらに遅いREGEXPステートメントを試しました。
SQLiteとPostgreSQLはMySQLと同じくらい制限されていますが、NoSQLシステムの経験は限られていますが、私の研究は、私が必要とするパフォーマンスではなくスケーラビリティに優れているという印象を与えてくれます。
私の質問はどこで解決策を探すべきですか?クエリを最適化する方法や、潜在的なレコードセットを絞り込むことのできる補助列を追加する方法を見つけようとしていますか?このような状況でワイルドカード検索を高速に実行できるように設計されたシステムはありますか?
おそらくFTS(全文検索)オプションを調べたいと思うかもしれません。 SQLite FTS4は私の経験ではうまくいきます。 – ergosys
このタイプのすべての(遅い)クエリはありますか? 'word LIKE '__e_b__on''? –
@ergosys - 私が理解しているところから、MySQLのftsはワイルドカード検索を一言では実行できません。 – Daniel