アプリ用のデータベースを構築しており、より大きなデータ セットでパフォーマンスの問題をテストしています。約 250,000 の位置レコードを生成しました。各場所は多くのカテゴリに割り当てることができ、カテゴリは多くの場所に割り当てることができます。私のデータセットには、各場所に割り当てられた 2 ~ 4 のカテゴリがあります。
ワイルドカード検索を使用して許可するカテゴリをフィルタリングすることで、ユーザーが場所を検索できるようにしたいと考えています。したがって、「赤」という単語が含まれるすべてのカテゴリを一致させたいと思うかもしれません。したがって、「赤」と入力すると、カテゴリ タイトルに「赤」が含まれるすべての場所が表示されます。さらに、同じ文字列で場所のタイトルをワイルドカード検索したいと考えています。
機能するクエリを作成しましたが、大規模なデータセットではパフォーマンスが低下します。基本的に、制限が設定されていて、結果がすぐに見つかる場合 (約 .05ms) に問題ない内部クエリを使用しています。すぐに結果が見つからない場合は、データベース全体を調べて、クエリに約 9 ~ 10 秒かかるようです。
これが私のデータベースの簡略化されたレイアウトです:
locations: id | title | address
categories: id | title
locations_categories: id | location_id | category_id
現在使用しているクエリは次のとおりです。
SELECT `id`,`title`,`address`
FROM (`locations`)
WHERE title LIKE '%string%'
AND WHERE id IN (
SELECT location_id
FROM locations_categories
JOIN categories ON categories.id = locations_categories.category_id
WHERE categories.title LIKE '%string%')