MySQL データベースに英語の辞書があり、エントリは 250,000 を少し超えています。シンプルな Ruby フロントエンドを使用して、文字列の先頭にワイルドカードを使用して検索しています。これまでのところ、私は次のようにしています。
SELECT * FROM words WHERE word LIKE '_e__o'
あるいは
SELECT * FROM words WHERE word LIKE '____s'
単語の正確な長さは常に知っていますが、1 文字を除いてすべてが不明な可能性があります。
これは糖蜜よりも遅く、列のインデックスを使用できないため、先頭にワイルドカードを使用しない同様のクエリよりも約 15 倍遅くなります。
検索の範囲を狭めるために、いくつかの方法を試しました。たとえば、各単語の個々の文字数を含む 26 の追加の列を追加し、最初にそれらを使用して検索を絞り込みました。また、単語の長さで絞り込んでみました。これらの方法は、先頭のワイルドカード検索が本質的に非効率であるため、ほとんど違いがありませんでした。REGEXP ステートメントを試してみましたが、これはさらに低速です。
SQLite と PostgreSQL は MySQL と同じように制限があり、NoSQL システムの経験は限られていますが、私の調査では、必要なパフォーマンスではなく、スケーラビリティに優れているという印象を受けました。
私の質問は、どこで解決策を探すべきですか? クエリを最適化する方法や、潜在的なレコードセットを絞り込むための補助列を追加する方法を探し続ける必要がありますか? この流れで高速なワイルドカード検索を実現するために特別に設計されたシステムはありますか?