可能であれば(新しいものを作成しているように)、テーブルレイアウトを再考する必要があります。おそらくカンマで区切られたものか、何かがあると思われます。これは実際にはうまくスケールされず、複雑で低速なような単純なクエリでさえも(実際の検索語の前にあるこれらのすべてのワイルドカードを使用すると、インデックスの使用は効果的に無効になります)。
おそらく、RECIPESテーブルに対するn:mカーディナリティの関係で、別のINGREDIENTSテーブルを使用することをお勧めします。擬似-SQLで
:
CREATE TABLE RECIPES (id int not null, [...more columns...]) PRIMARY KEY id;
CREATE TABLE INGREDIENTS (id int not null, name varchar(30), [...more columns...]) PRIMARY KEY id;
CREATE TABLE RECIPE_INGREDIENTS (recp_id int not null, ingred_id not null);
あなたがレシピや食材を参加できそうすれば:
SELECT RECIPES.id AS recipe, COUNT(INGREDIENTS.id) AS matching_ingredients
FROM RECIPES r JOIN RECIPE_INGREDIENTS ri ON r.ID=ri.recp_id
JOIN INGREDIENTS i ON ri.ingred_id = i.id
WHERE INGREDIENTS.name in ('mayonnaise', 'bacon', 'cheese')
GROUP BY COUNT(INGREDIENTS.id)
レシピ番号のテーブルと一致する成分の数をリードします。これはインデックスからも恩恵を受けるでしょう。
私は今のところ手元にMySQLサーバーを持っていないので、上記は私の頭の上から書かれています。たぶん私は少し間違って構文を持っています。さらに、Foreign Key情報を追加したいと思うかもしれませんが、それは実行するために厳密には必要ではありません。
これについては、MySQLマニュアルのCREATE TABLE
の構文を参照してください。
これは分かっていますが、データベース設計は理想的ではありません。正規化すれば、パフォーマンスが向上し、これらのタイプのクエリーを簡単に作成できるようになります。 –